我跑的时候怎么样:
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
我可以重新分配这些对象的值。
我的想法是,对象并不关心它们是否在数组中。
有人可以澄清这里发生了什么吗?
答案 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);