Как проверить, есть ли у объекта ключ в JavaScript?

Что делать правильно?

if (myObj['key'] == undefined)

или же

if (myObj['key'] == null)

или же

if (myObj['key'])

Соответствующие тесты: jsperf.com/checking-if-a-key-exists-in-a-javascript-array

zurfyx 06.01.2017 23:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1 411
1
1 314 833
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны использовать hasOwnProperty. Например:

myObj.hasOwnProperty('myKey');

Примечание: Если вы используете ESLint, приведенное выше может дать вам ошибку за нарушение правила нет встроенных прототипов, в этом случае обходной путь выглядит следующим образом:

Object.prototype.hasOwnProperty.call(myObj, 'myKey');

одна проблема, которую я обнаружил с hasOwnProperty в firefox, - это возврат false для унаследованного ключа

Keval Malde 17.10.2013 12:24

@maldy: разве не в этом весь смысл has**Own**Property?

huysentruitw 08.01.2014 11:54

для унаследованного ключа вы можете проверить так, если (myObj.key.key) он вернет true, если он существует

rashidnk 19.03.2016 12:12

ESLint отклоняет это как Do not access Object.prototype method 'hasOwnProperty' from target object.

CJBrew 28.09.2016 13:56

@CJBrew это может быть потому, что у вас есть флаг eslint нет встроенных прототипов, и в этом случае вы все равно можете использовать его, выполнив {}.hasOwnProperty.call(object, "key")

aug 03.03.2017 04:04

Идея заключается в том, что если вы выполняете myObj.hasOwnProperty(), вы позволяете myObj перехватывать этот вызов (и, таким образом, может испортить вашу логику) ... Однако это также можно рассматривать как преимущество, которое myObj может выбрать для этого. Лично я считаю, что ESLint очень внимателен в этих вопросах.

Stijn de Witt 07.04.2017 23:28

Стоит отметить, что если myObj.myKey действительно был объявлен как undefined (по какой-то безумной причине), то myObj.hasOwnProperty('myKey') вернет true.

Headbank 28.02.2019 18:14

Я оставлю это здесь для всех, кто задается вопросом, почему ESLint жалуется на eslint.org/docs/rules/no-prototype-builtins

JanithaR 16.05.2019 12:12

это антипаттерн imo, свойство собственный должно использоваться только для этого уровня.

GeorgeWL 31.07.2019 12:20
Ответ принят как подходящий

Попробуйте Оператор JavaScript в.

if ('key' in myObj)

И наоборот.

if (!('key' in myObj))

Будь осторожен! Оператор in сопоставляет все ключи объекта, включая ключи в цепочке прототипов объекта.

Используйте myObj.hasOwnProperty('key') для проверки собственных ключей объекта и вернет true только в том случае, если key доступен непосредственно на myObj:

myObj.hasOwnProperty('key')

Если у вас нет особой причины использовать оператор in, использование myObj.hasOwnProperty('key') дает результат, который ищет большинство кода.

Причина, по которой in считается плохим, заключается в том, что он выполняет поиск по всей цепочке прототипов.

Nishant 29.12.2014 11:28

и даже лучше - if (myObj && 'key' в myObj)

pkdkk 03.09.2015 16:53

что не так с поиском по всей цепочке прототипов (если вы не знаете, что не хотите этого делать по какой-то причине)?

jononomo 06.11.2015 23:52

@reconbot, в обычных объектно-ориентированных языках вы часто вызываете методы, определенные в родительских классах. Что не так, делая то же самое в js? Означает ли это, что сами цепочки прототипов js плохие? Некоторые люди действительно могут их использовать.

Gherman 26.12.2015 14:22

мог бы сделать вот так Object.keys (ObjectInWhichYouwantTocheckTheKey) .includes ('key‌ InObject') :) ура

Usman I 16.08.2018 10:58

TypeScript, похоже, не рассматривает hasOwnProperty или in как защиту типа.

Polv 14.09.2019 19:47

Uncaught (в обещании) TypeError: правая часть 'in' должен быть объектом, получившим неопределенное значение

Slowaways 16.09.2020 00:48

Вероятно, следует избегать использования hasOwnProperty и делать Object.prototype.hasOwnProperty.call(myObj, "key");. Что, если ваш объект имеет фактическое свойство, называемое hasOwnProperty, или хуже, если клиент добавляет это свойство? Вот еще контекст: eslint.org/docs/rules/no-prototype-builtins

Ivan Procopovich 13.11.2020 23:21

@Nishant - Производительность концерна? Потому что в противном случае кажется, что была бы желательна проверка всей цепочки прототипов ... вы выполняете эту проверку, потому что хотите знать, существует ли она, прежде чем вы попытаетесь получить к ней доступ, предположительно, и доступ к ней будет проходить через всю цепочку прототипов, если необходимо ...

ArtOfWarfare 02.01.2021 08:55

@ArtOfWarfare, да, производительность - это проблема. Я не делал (тяжелых) OOPS в JS, поэтому хотел бы услышать мнение экспертов по этому поводу. Я согласен, что это может быть полезно в зависимости от варианта использования :-)

Nishant 02.01.2021 17:47

@jononomo и другие: это проблема, если вы используете объект как карту. Если вы, например, хотите убедиться, что элемент был записан только один раз и более новый перезаписан, и использовать in, вы не сможете хранить ключи, которые равны имени метода прототипа.

SourceOverflow 17.01.2021 21:04

Другие вопросы по теме