答案 0 :(得分:2)
JavaScript中的常量会阻止重新分配变量,但不会阻止其属性。
const item = { foo: 0 };
item.foo = 1 // Works
item = { bar: 0 } // Error
如果要防止这种情况,可以对对象使用Object.freeze
const item = { foo: 0 };
Object.freeze(item);
item.foo = 1; // Won't modify its property
答案 1 :(得分:2)
const
是什么意思?如果使用const
关键字声明了变量,则表示不能将其分配给新值。这并不意味着您不能对其进行修改。更改对象的属性正在修改。
如果不希望更改对象,可以使用Object.freeze()
let someObj = {};
someObj.prop = 1; //setting prop to '1'
Object.freeze(someObj); //after this line you can't modify object
someObj.prop = "changed"; //prop will remain '1'
console.log(someObj)
注意: Object.freeze()
是浅冻结,表示如果存在嵌套对象,则仍可以对其进行修改。请看下面的例子。
const obj = {
upper:"something",
nested:{
nestProp:"this is nest prop"
}
}
Object.freeze(obj);
obj.upper = 'new' //can't be changed
obj.nested.nestProp = 'new' //will be changed
console.log(obj)
现在可以使用递归来解决此问题。
function completeFreeze(obj){
Object.freeze(obj);
for(let key in obj){
if(typeof obj[key] === "object"){
completeFreeze(obj[key])
}
}
}
const obj = {
upper:"something",
nested:{
nestProp:"this is nest prop"
}
}
completeFreeze(obj);
obj.nested.upper = 'new' //will not be changed
console.log(obj)