2015-04-07 43 views

回答

25

@@描述了所謂的着名符號。 (請注意,它實際上不是有效的語法在JS。)根據ES6/ES2015 specification

著名符號內置明確可以本規範的算法引用符號值。它們通常用作其值作爲規範算法的擴展點的屬性的鍵。除非另有說明,否則所有代碼領域(8.2)共享衆所周知的符號值。

代碼區域引用JavaScript環境的不同實例。例如,根文檔的代碼領域將與在中運行的JavaScript代碼領域不同。

當一個對象來自什麼樣的代碼領域時,它試圖使用instanceof來確定一個對象是否是一個數組(如果它來自另一個框架,它將不起作用)。爲避免這些類型的問題被符號彈出,它們被共享,因此無論對象來自何處,對(比如說)@@toString的引用都將起作用。

其中一些通過Symbol構造函數直接暴露,例如@@toPrimitive暴露爲Symbol.toPrimitive。可用於覆蓋試圖將對象轉換爲原始值時所產生的值,例如:

let a = { [Symbol.toPrimitive]:() => 1 }; 
console.log(+a); // 1 
console.log(a.valueOf()); // (the same object) 
console.log(a.toString()); // "[object Object]" 

一般來說,符號被用於提供在物體上的獨特性質,這不能以隨機屬性碰撞名稱,例如:

let a = Symbol(); 
let foo = { [a]: 1 }; 
foo[a]; // 1 

有沒有辦法進入除非獲得從某處符號價值(儘管你可以通過調用Object.getOwnPropertySymbols獲取對象的所有符號,所以它們不能被用來實現私有屬性或方法)。

1:請參閱this es-discuss topic瞭解有關不同名稱的一些討論。

+0

注意,這不能修復跨幀'instanceof'。一個更好的例子是跨幀可迭代數組。 – Bergi

+0

@Bergi:我一直試圖提供一個跨框架問題的例子,這並不是我的意思 - 也許我會試着重新說一遍。 –

相關問題