В чем разница между ключами объектов с кавычками и без кавычек?

209

Есть ли разница между

obj = {'foo': 'bar'} 

и

obj = {foo: 'bar'}

Я заметил, что вы не можете использовать -в ключе, когда я не использую кавычки. Но действительно ли это имеет значение? Если да, то какой?

MeO
источник

Ответы:

136

Нет, кавычки не имеют значения (если, как вы заметили, вы не хотите использовать ключ, который не является допустимым идентификатором JavaScript).

В качестве примечания, то формат обмена данными JSON действительно требуют двойные кавычки идентификаторы (и не не позволяет одинарные кавычки).

bdukes
источник
88
На самом деле, кавычки могут иметь значение, если вы используете числовой литерал в качестве имени свойства. Например, obj = { 12e34: true };не то же самое, что obj = { '12e34': true };. Первый из них потребует от вас доступа к собственности через obj['1.2e+35'], в то время как для второго вы будете использовать obj['12e34']. Смотрите мой ответ для более подробной информации.
Матиас Биненс
1
Верно, но было бы замечательно, если бы двойные кавычки были необязательными, учитывая первый символ аз + + буквенно-цифровой символ, и могут ли некоторые поклонники пробелов называться невидимыми пробелами или символами табуляции? отлично подходит для данных, не глубоко вложенных.
Джейсон Себринг
124

Из Uncooted имен свойств / ключей объектов в JavaScript моя статья по теме:

Кавычки могут быть опущены, только если имя свойства является числовым литералом или допустимым именем идентификатора .

[...]

Обозначение в скобках можно смело использовать для всех названий свойств.

[...]

Точечная нотация может использоваться только тогда, когда имя свойства является допустимым именем идентификатора.

Обратите внимание, что зарезервированные слова могут быть использованы в качестве имен свойств без кавычек в ES5. Однако, для обратной совместимости с ES3, я бы все равно предложил их процитировать.

Я также создал инструмент, который сообщит вам, можно ли использовать любое заданное имя свойства без кавычек и / или с точечной нотацией. Попробуйте это по адресу mothereff.in/js-properties .

Скриншот

Матиас Биненс
источник
Этот инструмент спасал жизнь. Спасибо за публикацию этого.
Крис Кристенсен
Я был на пути со скалы, собирался упасть с очень крутого уклона, разбиваясь о некой, полной кровавой смерти; но, увы, я нажал на ссылку в вашем ответе, в которой был очень простой инструмент JS, который не позволил мне упасть с обрыва. Этот инструмент спасал жизнь.
Андрей
8

Здесь нет никакой разницы. Просто вопрос стиля. Одной из причин для этого является возможность использовать «super» или «class» в качестве ключа, поскольку это зарезервированные ключевые слова.

У некоторых людей может возникнуть искушение передать строку с пробелом, а затем вызвать o [«У меня может быть пробел»]. Но я бы назвал это плохой практикой.

Raynos
источник
3

Нет, не в javascript. Однако некоторые синтаксические анализаторы JSON не будут работать, если кавычки вокруг ключей отсутствуют.

01001111
источник
35
Ключи без кавычек недопустимы в JSON.
Нед Бэтчелдер
1

Есть ситуации, когда они разные. Например, если вы используете jQuery и создаете список параметров для передачи при вызове команды jQuery $ () для создания элемента, слова в кавычках превращаются в параметры, а слова в кавычках превращаются в функции. Например, «size» установит атрибут размера объекта, а size (без кавычек) вызовет функцию size () для объекта. Смотрите jQuery () , внизу:

Хотя второй аргумент удобен, его гибкость может привести к непредвиденным последствиям (например, $ (" <input>", {size: "4"}), вызывающему метод .size () вместо установки атрибута размера). Таким образом, предыдущий блок кода может быть записан как:

spekary
источник
Я не думаю, что этот пример говорит то, что вы думаете, что говорит. Проблема, которую вы процитировали, заключается в том, что в jQuery есть метод с именем size, а конфликт между размером метода и размером атрибута решается путем выбора метода. В jQuery есть случаи, когда передача значения в виде строки или другого типа вызывает изменение в поведении, но никогда не приводит к определению свойства с допустимым именем свойства в кавычках, а не в кавычках.
Алекс Вайцер