我有以下Ecma-Script-6模板常量代码。
const person = 'John Smith';
console.log(person);
person = 'Naeem Shaikh';
console.log("{{After changing the value for person.name}}");
console.log(person);
当然它不起作用。 http://www.es6fiddle.net/i3vhumdx/它出现以下错误,
person is read-only
现在和对象一样。
const person = {name: 'John Smith'};
console.log(JSON.stringify(person));
person.name='Naeem Shaikh';
person.age="24";
console.log("{{After changing the value for person.name}}");
console.log(JSON.stringify(person));
http://www.es6fiddle.net/i3vhzblm/
输出是:
{"name":"John Smith"}
{{After changing the value for person.name}}
{"name":"Naeem Shaikh","age":"30"}
这里我可以写入一个只读对象而没有任何问题。任何人都可以解释这种行为。
答案 0 :(得分:3)
当改变从该函数内部传递给函数的参数时,你会有相同的行为:如果它是一个字符串,那么外部字符串不会被改变,如果它是一个对象而你是更改属性,它会被更改。
关键是变量的值是:
当您更改属性时,您不会更改值(对象的引用)。
the MDN的摘录:
// const also works on objects
const myObject = {"key": "value"};
// However, object attributes are not protected,
// so the following statement is executed without problems
myObject.key = "otherValue";
您似乎想要的是拥有一个恒定的不可变对象。 Freeze它:
const person = Object.freeze({name: 'John Smith'});
这样就无法更改此人的姓名。