网站搜索

为什么在 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