@@ describe lo que se denomina un símbolo conocido. (Tenga en cuenta que en realidad no es una sintaxis válida en JS). De acuerdo con la especificación ES6/ES2015 1 :
Los símbolos conocidos son valores de símbolo incorporados a los que los algoritmos de esta especificación hacen referencia explícita. Por lo general, se utilizan como claves de propiedades cuyos valores sirven como puntos de extensión de un algoritmo de especificación. A menos que se especifique lo contrario, los valores de símbolos bien conocidos son compartidos por todos los Code Realms (8.2).
Code Realms se refiere a diferentes instancias de un entorno de JavaScript. Por ejemplo, el Code Realm del documento raíz sería diferente al de JavaScript que se ejecuta en un <iframe> .
Un ejemplo de dónde importa de qué reino de código proviene un objeto es cuando se intenta usar instanceof para determinar si un objeto es una matriz (pista: no funcionará si es de otro marco). Para evitar que este tipo de problemas aparezcan con símbolos, se comparten para que las referencias a (digamos) @@toString funcionen sin importar de dónde provenga el objeto.
Algunos de estos se exponen directamente a través del constructor de Symbol , por ejemplo, @@toPrimitive se expone como Symbol.toPrimitive . Eso se puede usar para anular el valor producido al intentar convertir un objeto en un valor primitivo, por ejemplo:
let a = { [Symbol.toPrimitive]: () => 1 }; console.log(+a); // 1 console.log(a.valueOf()); // (the same object) console.log(a.toString()); // "[object Object]"En general, los símbolos se utilizan para proporcionar propiedades únicas en un objeto que no puede coincidir con un nombre de propiedad aleatorio, por ejemplo:
let a = Symbol(); let foo = { [a]: 1 }; foo[a]; // 1 No hay forma de acceder al valor, excepto obteniendo el símbolo de algún lugar (aunque puede obtener todos los símbolos de un objeto llamando a Object.getOwnPropertySymbols , por lo que no se pueden usar para implementar propiedades o métodos privados).
1: Consulte este tema de debate para obtener información sobre los diferentes nombres.