2016-07-05 13 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);

相關問題