是否可以在 javascript 中创建一个固定长度的数组?

新手上路,请多包涵

是否可以在 Javascript 中创建一个长度保证保持不变的数组?

For example, the array A is created with length 2. Subsequently, any attempt to call A.push() or A.pop() , or set the value of A[5] 会失败。 A.length 永远是 2。

这是类型数组(例如 Float32Array )已经工作的方式。它们有固定的尺寸。但我想要一种在常规数组上获得相同行为的方法。

对于我的具体情况,我想创建一个固定长度的数组,其中每个条目都是一个对象。但我仍然想知道一般问题的答案。

原文由 Daniel Howard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 368
2 个回答

更新:

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 所建议的那样,您可以冻结对象:

 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

但是,您无法更改冻结对象的值。如果你有一个对象数组,这可能不是问题,因为你仍然可以更改对象的值。

对于数字数组,当然有 类型化数组

Object.freeze 是 ES2015 的一部分, 但大多数浏览器似乎都支持它,包括 IE9 。您当然可以对其进行功能测试:

if(Object.freeze) { Object.freeze(obj); }

原文由 tim-we 发布,翻译遵循 CC BY-SA 4.0 许可协议

实际上,要在大多数现代浏览器(包括 IE 11)上的 js 中创建一个完全优化的 true c 类固定数组,您可以使用:TypedArray 或 ArrayBuffer,如下所示:

 var int16 = new Int16Array(1); // or Float32Array(2)
int16[0] = 42;
console.log(int16[0]); // 42
int16[1] = 44;
console.log(int16[1]); // undefined

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

原文由 Micheal Kris 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题