2017-07-14 67 views
0

为什么当我运行:Object.freeze不会冻结对象数组

var test = { 
    'test': 5 
}; 

Object.freeze(test); 

// Will throw error 
test.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(i); 
}; 

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

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

我的想法是,对象不关心他们在一个数组中。

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

回答

2

你冻结而不是与此索引对象的索引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]);

+0

刚刚看到的是,当我回去,并检查了我的代码。谢谢! – hdifen

1

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

-1

我建议让利用JavaScript的功能特性你的语法更简洁。就像使用.map来实现迭代数据结构一样。在这种情况下,您不需要使用范围泄漏且容易出错的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);