在Javascript中,是否可以创建一个保证长度保持不变的数组?
例如,数组A
创建的长度为 2。随后,任何调用的尝试A.push()
or A.pop()
,或设置值A[5]
将失败。A.length
永远是 2。
这是输入数组的方式(例如Float32Array
)已经可以工作了。它们有固定的尺寸。但我想要一种在常规数组上获得相同行为的方法。
对于我的具体情况,我想创建一个固定长度的数组,其中每个条目都是一个对象。但我仍然想知道一般问题的答案。
Update:
对象密封 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal(这是 ES2015 的一部分)将做到这一点:
// create array with 42 empty slots
let a = new Array(42);
if(Object.seal) {
// fill array with some value because
// empty slots can not be changed after calling Object.seal
a.fill(undefined);
Object.seal(a);
// now a is a fixed-size array with mutable entries
}
原答案:
几乎。正如所建议的titusfx https://stackoverflow.com/users/929026/titusfx您可以冻结该对象:
let a = new Array(2);
// set values, e.g.
a[0] = { b: 0; }
a[1] = 0;
Object.freeze(a);
a.push(); // error
a.pop(); // error
a[1] = 42; // will be ignored
a[0].b = 42; // still works
但是,您无法更改冻结对象的值。
如果你有一个对象数组,这可能不是问题,因为你仍然可以
更改对象的值。
对于数字数组当然有类型数组 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays.
Object.freeze
是其一部分ES2015 但大多数浏览器似乎都支持它,包括IE9 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze。您当然可以对其进行功能测试:
if(Object.freeze) { Object.freeze(obj); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)