在Ecmascript-6中将对象定义为常量

时间:2014-12-19 11:54:37

标签: javascript node.js ecmascript-6

我有以下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"}

这里我可以写入一个只读对象而没有任何问题。任何人都可以解释这种行为。

1 个答案:

答案 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'});

这样就无法更改此人的姓名。