Object.freeze不会冻结数组中的对象

时间:2017-07-14 19:11:01

标签: javascript object

我跑的时候怎么样:

var nestedTest = [
    {'test': 5},
    {'test': 6},
    {'test': 7},
    {'test': 8}
];

// Freeze all the objects in the array
for (var i = 0; nestedTest.length > i; i++) {
    Object.freeze(i);
};

// Will overwrite
test[0].test = 3;

我会收到错误(如预期的那样),但如果我这样做

\w

我可以重新分配这些对象的值。

我的想法是,对象并不关心它们是否在数组中。

有人可以澄清这里发生了什么吗?

3 个答案:

答案 0 :(得分:3)

你要冻结索引i而不是带有这个索引的对象,你的逻辑应该是:

Object.freeze(nestedTest[i]);

而不是:

Object.freeze(i);

for循环内,完整代码:

// Freeze all the objects in the array
for (var i = 0; nestedTest.length > i; i++) {
    Object.freeze(nestedTest[i]);
};

注意:最后一行还有一点错字,应该是:

nestedTest[0].test = 3;

希望这有帮助。



var nestedTest = [
    {'test': 5},
    {'test': 6},
    {'test': 7},
    {'test': 8}
];

// Freeze all the objects in the array
for (var i = 0; nestedTest.length > i; i++) {
    Object.freeze(nestedTest[i]);
};

// Trying to overwrite
nestedTest[0].test = 3;

//Not overwriten
console.log(nestedTest[0]);




答案 1 :(得分:1)

Object.freeze(i);应为Object.freeze(nestedTest[i]);test[0].test = 3;应为nestedTest[0].test = 3;

答案 2 :(得分:-1)

我建议使用Javascript的功能特性使您的语法更简洁。比如,将.map用于Iterateable数据结构。在这种情况下,您不需要使用范围漏洞且容易出错的for循环。

简洁的方法是:

var nestedTest = [
    {'test': 5},
    {'test': 6},
    {'test': 7},
    {'test': 8}
].map(item => Object.freeze(item));

甚至:

var nestedTest = [
    {'test': 5},
    {'test': 6},
    {'test': 7},
    {'test': 8}
].map(freezeArrayItem);

const freezeArrayItem = (item) => Object.freeze(item);