如何在javascript中创建静态数组

我正在尝试创建一个静态数组。 但我发现它可以在运行时增加数组中的项。 我如何在javascript中实现静态数组? 为什么数组在javascript中是可变的?

var a = []; //var a = new Array(3); for (var i = 0; i < 5; i++) { //a.push(i); a[i] = i; } document.write(a); 

的jsfiddle

您可以使用Object.freeze冻结数组:

 "use strict"; var a = Object.freeze([0, 1, 2]); console.log(a); try { a.push(3); // Error } catch (e) { console.error(e); } try { a[0] = "zero"; // Error } catch (e) { console.error(e); } console.log(a); 

使用最新的JS语法(旧浏览器所需的polyfill):

 var list = Object.seal([1,2,3]) 

Object.seal阻止对Object的进一步更改。

听起来你想要一个不可变的数组。

大多数语言都有不可变的集合,无论是内置还是来自库。 JS不会正常包含它们,但Facebook提供了一个包含所有典型的不可变集合类型的库。

虽然immutablejs没有这样的数组类型,但它确实有更传统的List

 const staticArray = List([0, 1, 2, 3, 4]); 

您可以使用Object.defineProperties()在属性描述符中设置writable:falseconfigurable:falseObject.preventExtensions()以防止将新属性添加到数组或对象。

 "use strict"; const ro = obj => { const props = {}; const length = obj.length || Object.keys(obj).length; const entries = Array.isArray(obj) ? [...obj, length].entries() : Array.from(Object.keys(obj), prop => [prop, obj[prop]]); for (let [key, value] of entries) { props[key === length ? `length` : key] = { value: value, configurable: false, writable: false } } return Object.preventExtensions(Object.defineProperties(obj, props)); }; let arr = ro([1,2,3]); try { console.log(`arr[0]:${arr[0]}`); console.log(`try to set arr[0] to ${arr[0] = 4}`); } catch (e) { console.error(e) } try { console.log(`try to .push() to arr ${arr.push(4)}`); } catch (e) { console.error(e) } try { console.log(`try to set .length of arr ${arr.length = 4}`); console.log(arr.length); } catch (e) { console.error(e) } try { console.log(`try to delete of arr[1] ${delete arr[1]}`); console.log(arr.length); } catch (e) { console.error(e) } console.log(JSON.stringify(arr, null, 2)); let obj = ro({a:1, b:2, c:3}); try { console.log(`obj["c"]:${obj["c"]}`); console.log(`try to assign 4 to obj["c"]:${obj["c"] = 4}`); } catch (e) { console.error(e) } try { console.log(`try to assign property "d" to obj:${obj["d"] = 4}`); } catch (e) { console.error(e) } try { console.log(`try to delete property "b" of obj:${delete obj["b"]}`); } catch (e) { console.error(e) } console.log(JSON.stringify(obj, null, 2));