Яка різниця між об’єктними ключами з лапками і без лапок?


209

Чи є різниця між

obj = {'foo': 'bar'} 

і

obj = {foo: 'bar'}

Я помітив, що ви не можете використовувати -ключ, коли я не використовую лапки. Але чи насправді це має значення? Якщо так, що?

Відповіді:


136

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

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


88
Власне, лапки можуть змінити значення, якщо в якості імені властивості використовувати числовий літерал. Наприклад, obj = { 12e34: true };не те саме, що obj = { '12e34': true };. Перший зажадає від вас доступу до ресурсу obj['1.2e+35'], тоді як для другого ви використовуєте obj['12e34']. Дивіться мою відповідь для отримання більш детальної інформації.
Матіас Байненс

1
Щоправда, але це було б блискуче, якби подвійні лапки були необов’язковими з а.з. першим символом + альфа-числовим і, можливо, цілком багато шанувальників пробілів, як-от невидимих ​​пробілів чи вкладок? чудово підходить для даних, не глибоко вкладених.
Джейсон Себрінг

124

З імен властивостей / клавіш об'єктів у JavaScript в моєму записі на тему:

Котирування можна опустити, лише якщо ім'я властивості є числовим буквеним чи дійсним ідентифікаційним іменем .

[…]

Нотацію дужок можна безпечно використовувати для всіх імен властивостей.

[…]

Позначення точок можна використовувати лише тоді, коли ім'я властивості є дійсним ідентифікаційним іменем.

Зауважте, що зарезервовані слова дозволяється використовувати як нецитовані імена властивостей у ES5. Однак для зворотної сумісності з ES3 я б запропонував їх все-таки цитувати.

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

Знімок екрана


Цей інструмент був рятівником життя. Дякуємо, що опублікували це.
Кріс Крістенсен

Я вже йшов зі скелі, що збирався впасти дуже крутим нахилом, просуваючись до певної, цілком кривавої смерті; але на жаль, я натиснув посилання у вашій відповіді, в якому був дуже простий інструмент JS, який заважав мені впасти зі цієї скелі. Цей інструмент був рятівником життя.
Андрій

8

Тут немає різниці. Просто питання стилю. Однією з причин цього є можливість використовувати «супер» або «клас» як ключову, оскільки це зарезервовані ключові слова.

Деякі люди можуть спокуситися передати рядок з пробілом, а потім зателефонувати o ['Я можу мати пробіл'], але я б назвав це поганою практикою.


3

Ні, не в JavaScript. Однак деякі JSON-аналізатори вийдуть з ладу, коли лапок навколо клавіш немає.


35
Клавіші без лапок є недійсними в JSON.
Нед Батчелдер

1

Є деякі ситуації, коли вони різні. Наприклад, якщо ви використовуєте jQuery, і ви створюєте список параметрів, які потрібно передавати при виклику команди jQuery $ () для створення елемента, слова, які цитуються, перетворюються на параметри, а слова, які не цитуються, перетворюються на функції. Наприклад, "size" встановить атрибут size об'єкта, а size (без лапок) викличе функцію size () на об'єкті. Дивіться jQuery () , внизу:

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


Я не думаю, що цей приклад говорить про те, що ти думаєш. Проблема, яку ви цитували, полягає в тому, що jQuery має метод, який називається розміром, і конфлікт між розміром методу та розміром атрибута вирішується шляхом вибору методу. У jQuery є випадки, коли передача значення у вигляді рядка чи іншого типу викликає зміну поведінки, але ніколи не визначаючи властивість з дійсним іменем властивості в лапках проти, а не в лапках.
Алекс Вайцер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.