Рядок шаблону як назва властивості об’єкта


80

Чому JavaScript не дозволяє рядок шаблону як ключ властивості об’єкта? Наприклад, коли я вводжу:

foo = {`bar`: 'baz'}

у NodeJS REPL він викидає SyntaxErrorз "Несподіваним рядком шаблону" з довгим трасуванням стека. Однак вартості властивостей чудові, що не так вже й несподівано. Подібні помилки трапляються у браузері, наприклад, Firebug видає a SyntaxErrorз "недійсним ідентифікатором властивості".

Рядки шаблонів дозволені в "обчислюваних назвах властивостей". Наприклад, це чудово компілюється у всіх браузерах, які підтримують синтаксис:

var foo = {
    [`bar` + 1]: `baz`
};

і створює об’єкт {"bar1": "baz"}.

Чому рядки шаблонів заборонені як літеральні об’єктні ключі? Це з міркувань продуктивності? Рядки шаблонів повинні бути скомпільовані, можливо, під час виконання (виправте мене, якщо я помиляюся), що означає, що кожного разу, коли він зустрічає цей об'єкт, інтерпретатору доведеться обчислювати ім'я об'єкта. Враховуючи такі речі, як "приготовані" рядки шаблонів, здається, це може стати повільним, хоча у нас є геттери та сетери з ES5. Firefox не згадує про це як про помилку, саме тому я визнав це несподіваним. Чи буде дозволено синтаксис колись у майбутньому?


2
Чи не в цьому причина, введено обчислювані назви властивостей. Так, вам потрібні фігурні дужки навколо нього, але це також синтаксично виглядає кращим як загальне рішення, що стосується різних сценаріїв.
Praveen Puglia

Я просто переосмислюю свою відповідь і не надто впевнений, що вона була правильною. Зараз я копаюся в документах ES6 ....
Макс.

Чому рядки шаблонів заборонені як літеральні об’єктні ключі? Вони є, у вас просто неправильний синтаксис ...?
Математика

Відповіді:


70

Чому рядки шаблонів заборонені як літеральні об’єктні ключі?

Рядки шаблонів - це вирази, а не літерали 1 . Ви можете використовувати лише рядкові літерали (та ідентифікатори) для імен властивостей, для всього іншого - що, як відомо, не є статичним - вам потрібно обчислене ім’я властивості.

Це з міркувань продуктивності?

Ні, це малоймовірно. Це полегшує розбір і дозволяє легко відрізнити постійні (статично відомі) імена властивостей від динамічно обчислюваних.

І головним чином, це особливість, яка нікому не потрібна. Це нічого не спрощує і не скорочує, і те, що ви б цим досягли, вже можливо.

Чи буде дозволено синтаксис колись у майбутньому?

Ні.

1: Навіть коли їх називають "літералами шаблонів", технічно вони не є літералами . І: шаблони навіть не повинні бути рядками, вони можуть оцінювати що завгодно.


2
а як щодо `var obj = {` $ {dyanmicKey} `: val}`?
b4d4r

78
@ b4d4r: Ні - вам потрібно використовувати обчислені властивості. Або var obj = {[`${dyanmicKey}`]: val}або просто var obj = {[dyanmicKey]: val}.
Бергі

Чоловіче, чому б ні. Вони просто не хочуть, щоб люди
вводили

@Bergi Як можна виправити таке:profile.preferences.networks[${network.name}]
basickarl

1
@SafalPillai Не всередині імені ідентифікатора без котирувань, але {"#key": "value"}абсолютно добре.
Бергі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.