Как проверить, существует ли определенный ключ в объекте или массиве JavaScript?
Если ключ не существует, и я пытаюсь получить к нему доступ, он вернет false? Или скинуть ошибку?
javascript
arrays
object
Адам Эрнст
источник
источник
property.key = property.key || 'some default value'
всякий случай, если я хочу, чтобы этот ключ существовал с некоторой ценностью для негоОтветы:
Проверка на неопределенность не является точным способом проверки существования ключа. Что если ключ существует, но значение действительно
undefined
?Вместо этого вы должны использовать
in
оператор:Если вы хотите проверить, не существует ли ключ, не забудьте использовать круглые скобки:
Или, если вы хотите особенно проверить свойства экземпляра объекта (а не наследуемые свойства), используйте
hasOwnProperty
:Для сравнения производительности между методами, которые
in
,hasOwnProperty
и клавишаundefined
, увидеть этот тестисточник
быстрый ответ
Прямой доступ к отсутствующему свойству с использованием (ассоциативного) стиля массива или стиля объекта вернет неопределенную константу.
Медленный и надежный в операторе и hasOwnProperty метод
Как уже упоминалось здесь, у вас может быть объект со свойством, связанным с неопределенной константой.
В этом случае вам придется использовать hasOwnProperty или в операторе , чтобы знать , если ключ действительно есть. Но, но по какой цене?
Итак, я говорю вам ...
in operator и hasOwnProperty являются «методами», которые используют механизм дескриптора свойства в Javascript (аналогично отражению Java в языке Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
С другой стороны, вызов метода объекта или ключа будет использовать механизм Javascript [[Get]]. Это намного быстрее!
эталонный тест
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
,
Использование в оператореРезультат был
Использование hasOwnPropertyРезультат был
Прямой доступ к элементам (стиль скобок)Результат был
Прямой доступ к элементам (стиль объекта)Результат был
РЕДАКТИРОВАТЬ: Какова причина, чтобы присвоить свойству
undefined
значение?Этот вопрос озадачивает меня. В Javascript есть по крайней мере две ссылки на отсутствующие объекты, чтобы избежать подобных проблем:
null
иundefined
.null
является примитивным значением, которое представляет собой намеренное отсутствие какого-либо значения объекта или, в краткосрочной перспективе, подтвержденное отсутствие значения. С другой стороны,undefined
это неизвестное значение (не определено). Если есть свойство, которое будет использоваться позже с правильным значением, рассмотрите использованиеnull
ссылки, а неundefined
потому, что в начальный момент подтверждается, что свойство не имеет значения.Для сравнения:
Советовать
Избегайте объектов со
undefined
значениями. Проверяйте напрямую, когда это возможно, и используйтеnull
для инициализации значений свойств. В противном случае используйте медленныйin
оператор илиhasOwnProperty()
метод.РЕДАКТИРОВАТЬ: 12/04/2018 - НЕ ОТНОСИТЕЛЬНО больше
Как прокомментировали люди, современные версии движков Javascript (за исключением Firefox) изменили подход к свойствам доступа. Текущая реализация медленнее, чем предыдущая, для этого конкретного случая, но разница между ключом доступа и объектом незначительна.
источник
delete hash[key]
это гораздо медленнее , чемhash[key] = undefined
. Конечно, в этом случае для меня нет смысла нуждаться вin
операторе, но он действует как контрпример «мы всегда должны избегать установки значения в undefined».Это вернется
undefined
.undefined
это специальное постоянное значение. Так что вы можете сказать, например,Это, вероятно, лучший способ проверить отсутствие ключей. Однако, как указано в комментарии ниже, теоретически возможно, что вы захотите иметь фактическое значение
undefined
. Мне никогда не нужно было этого делать, и я не могу придумать причину, почему я бы этого хотел, но просто ради полноты вы можете использоватьin
оператористочник
var undefined = 42;
. При тестировании на неопределенные реквизиты вы всегда должны использовать((typeof variable) === "undefined")
.undefined
не является записываемым свойством согласно спецификации ecma-international.org/ecma-262/5.1/#sec-15.1.1.3Принятый ответ относится к объекту . Осторожно с помощью
in
оператора на массиве найти данные вместо клавиш:Чтобы проверить существующие элементы в массиве: лучший способ узнать, находится ли элемент в массиве JavaScript?
источник
Вероятно, тестируются только значения атрибутов объекта, которые сильно отличаются от ключей массива
источник
Три способа проверить, присутствует ли свойство в объекте javascript:
!!obj.theProperty
Преобразует значение в bool. возвращает
true
для всех, кромеfalse
стоимостиtheProperty
' в objВозвращает true, если свойство существует, независимо от его значения (даже пустое)
obj.hasOwnProperty('theProperty')
Не проверяет прототип цепи. (поскольку все объекты имеют
toString
метод, 1 и 2 вернут true для него, а 3 может вернуть false для него.)Ссылка:
источник
var a = {a : undefined, b : null}; !!a.a **will return false**
!!obj.theProperty
это не решение для проверки, если объект имеет свойство с именемtheProperty
. Сбой для любого значения свойства falsey,,undefined
null, numeric0
илиNaN
, и пустой строки""
Если вы используете библиотеку underscore.js, то операции с объектами / массивами становятся простыми.
В вашем случае можно использовать метод _.has. Пример:
возвращает истину
Но,
возвращает ложь
источник
Ответ:
Объяснение:
in
Оператор будет проверять , если ключ существует в объекте. Если вы проверили, было ли значение неопределенным:,if (myObj["key"] === 'undefined')
вы можете столкнуться с проблемами, потому что ключ может существовать в вашем объекте соundefined
значением.По этой причине гораздо лучше сначала использовать
in
оператор, а затем сравнивать значение, которое находится внутри ключа, когда вы уже знаете, что оно существует.источник
Вот вспомогательная функция, которую я нахожу весьма полезной
Это
keyExists(key, search)
можно использовать для простого поиска ключа внутри объектов или массивов!Просто передайте ему ключ, который вы хотите найти, и найдите obj (объект или массив), в котором вы хотите его найти.
Это было довольно надежно и хорошо работает в разных браузерах.
источник
Array.indexOf
метод? (если вы ищете значение, то есть)Ванила JS
Если вы хотите проверить, есть ли у объекта хотя бы одно свойство в es2015
источник
Решение ES6
используя
Array#some
иObject.keys
. Он вернет true, если данный ключ существует в объекте, или false, если его нет.Пример в одну строку.
источник
Мы можем использовать -
hasOwnProperty.call(obj, key);
Способ underscore.js -
источник
Самый простой способ проверить это
например:
Возвращаемое значение как true подразумевает, что ключ существует в объекте.
источник
Для тех, кто
lodash
включил в свой проект:есть метод lodash _.get, который пытается получить «глубокие» ключи:
Это эффективно проверит, определен ли этот ключ, сколь бы глубоким он ни был , и не выдаст ошибку, которая может повредить потоку вашей программы, если этот ключ не определен.
источник
Хотя это не обязательно проверяет, существует ли ключ, оно проверяет правильность значения. Который
undefined
иnull
подпадает под.Boolean(obj.foo)
Это решение работает лучше всего для меня, потому что я использую машинописный текст, и такие строки, как таковые,
'foo' in obj
илиobj.hasOwnProperty('foo')
для проверки, существует ли ключ или нет, не предоставляют мне intellisense.источник
Если вы хотите проверить любой ключ на любой глубине объекта и учесть значения Falsey, рассмотрите эту строку для служебной функции:
Результаты
Также посмотрите этот пакет NPM: https://www.npmjs.com/package/has-deep-value
источник
источник
В мире «массивов» мы можем рассматривать индексы как некие ключи. Что удивительно,
in
оператор (который является хорошим выбором для объекта) также работает с массивами. Возвращаемое значение для несуществующего ключа:undefined
источник
yourArray.indexOf (yourArrayKeyName)> -1
правда
ложный
источник
Эти примеры могут продемонстрировать различия между разными способами. Надеюсь, это поможет вам выбрать правильный для ваших нужд:
источник
Новое потрясающее решение с JavaScript Destructuring :
Проверяйте другое использование JavaScript Destructuring
источник