2016-07-05 14 views
2

如果我没有错,variable名称使用的指针在内存中不能改变,但是变量points可能会改变。为什么我的常数不能指向新值

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

它应该不打印雅虎,因为变量名称的值已被更改..任何人都可以解释我这一点。

又如,当其变化......

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

我抵达该处困惑,任何人都可以解释我这一点。

+0

第一个例子不是特定于常量的。原始字符串被复制,没有参考被传递。在第二种情况下,引用不会改变,对象的属性不是常量,只有对象与引用“foo”的绑定是恒定的。要获得一个具有常量属性的对象,可以使用'const foo = Object.freeze([]);'。简而言之,'const foo ='...';'只是阻止你使用未来的'foo ='...';'。 – Xufox

+1

'const'意味着允许变异'const xs = [1,2]; XS。推(3)',禁止重新分配'const ys = [1,2]; ys = [1,2,3] //失败 – ftor

回答

3

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

JS字符串在声明或创建后不可变,所以foo不是对name的值的引用,它指向字符串。你不会改变字符串,你指向一个不同的字符串。

数组变量指向该对象,并在其发生突变后继续指向同一对象。但是,由于const并不深,所以仍然指向相同的对象。

这也突出了JS'const的一个常见误解,其功能更像Java的final而不是C++的const。您声明变量const,而不是该对象的一个​​实例,因此它只会阻止您将其重新分配给该变量,并不会阻止您修改该基础对象。

2

从MDN:

常量声明创建了一个只读的参照值。这并不意味着它所拥有的价值是不可变的,只是变量标识符不能被重新分配。

这意味着,可以改变分配给const值,通过改变阵列或对象说,但不能分配一个新值const变量。例如: -

有效

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);

相关问题