为什么我的常数没有指向新的价值

时间:2016-07-05 19:25:29

标签: javascript ecmascript-6 const

如果我没有错,variable名称所使用的指针在内存中不会改变,但变量points可能会改变。

let name = "google";
const foo = name;
console.log(foo); //prints google
name = "yahoo"; 
console.log(foo); //prints google again instead of yahoo

不应该打印yahoo,因为变量名的值已经改变了。任何人都可以解释一下。

另一个例子,它的变化......

const foo = [];
foo.push("test");
console.log(foo); // outputs ["test"]

我在这里感到困惑,任何人都可以解释我这个。

2 个答案:

答案 0 :(得分:3)

您的第一个示例使用不可变字符串,第二个示例使用可变对象。

JS字符串在声明或创建后是不可变的,因此foo不是对name的值的引用,而是指向字符串。您没有更改字符串,而是指向另一个字符串。

数组变量指向对象,并在变异后继续指向同一个对象。但是,您仍然指向同一个对象,因为const不深。

这也凸显了JS与JS的共同误解。 const,其功能更像Java' final,而不是C ++ const。您将变量声明为const,而不是对象的实例,因此它只会阻止您重新分配给变量,它不会阻止您改变底层对象。

答案 1 :(得分:2)

来自MDN:

  

const声明创建对值的只读引用。它并不意味着它拥有的值是不可变的,只是无法重新分配变量标识符。

这意味着您可以更改分配给const的值,例如更改数组或对象,但无法为const变量分配新值。 E.g:

<强>有效

const a = [];
a.push(5);
console.log(a);

const b = {};
b['foo'] = 'bar';
console.log(b);

无效:这会抛出错误

const a = [];
a = [5];
console.log(a);

const b = {};
b = {'foo': 'bar'};
console.log(b);