Подтвердить что ты не робот

Что означает @@( "at at" ) в ES6 JavaScript?

Я заметил @@, используемый в несколько pages о новых функциях ES6, но я не знаю, что именно это означает (будь то собственно синтаксис или просто какое-то соглашение о документации). И это сложно для Google. Может кто-нибудь объяснить это?

4b9b3361

Ответ 1

@@ описывает то, что называется хорошо известным символом. (Обратите внимание, что это не действительный синтаксис в JS.) В соответствии с ES6/ES2015 1спецификация:

Известные символы являются встроенными значениями символов, которые явно указаны алгоритмами этой спецификации. Они обычно используются как ключи свойств, значения которых служат точками расширения алгоритма спецификации. Если не указано иное, известные значения символов разделяются всеми областями кода (8.2).

Коды Realms ссылаются на разные экземпляры среды JavaScript. Например, Code Realm корневого документа будет отличаться от кода JavaScript, работающего в <iframe>.

Пример того, что имеет значение, из какого домена кода возникает объект, при попытке использовать 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: См. эту тему обсуждения для обсуждения разных имен.