为什么常量的属性或值不是常量

时间:2019-05-12 20:02:33

标签: javascript variables constants

node.js screenshot

我正在再次学习JavaScript的基础知识,想知道JavaScript在代码中的实际应用方式。如上所示,为什么常量的属性或值不是常量?并有一种方法可以防止在以后的代码中编辑属性或值?

2 个答案:

答案 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)