为什么在 JavaScript 中,即使将数组的 length 属性设置为只读,它的值仍会改变?
我在 Chrome 控制台中尝试了以下代码
var a = new Array(1,2,3,4);
a.length
这显示长度为 4,正如预期的那样。现在我尝试将 length 属性设置为 writable: false
Object.defineProperty(a, "length", {writable: false});
a[4] = 5;
a.length
尽管属性被设置为 writable:false,但这导致了结果为 5。那是怎么发生的?它不应该保持不变,因为它被设置为只读(writable:false)吗?
答案#1
Object.defineProperty(a, "length", {writable: false}); 只会影响你直接给 .length 属性赋值的方式。
var a = [1,2,3,4];
Object.defineProperty(a, "length", {writable: false});
a.length = 0;
console.log(a.length); // still be 4
答案#2
writable 属性仅限制 赋值运算符 对该 属性本身 的使用。此外,writable 属性的默认值已经是 false。
例如:
var a = new Array(1,2,3,4);
a.length; # 4
a.length++; # a.length is still 4
你可以查看:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
如果你希望保留 a.length 的原始值,我认为你最好将其赋值给另一个变量:
x = [1,2,3,4]; # x.length is 4
y = x.length; # y is 4
x = [1,2,3,4,5] # x.length is now 5, but y is still 4
