Как проверить, имеет ли объект конкретное свойство в JavaScript?
Рассматривать:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
Это лучший способ сделать это?
javascript
sheats
источник
источник
in
иhasOwnProperty
вышел намного медленнее, чем другие для меня (на 98% медленнее). Я не удивлен,hasOwnProperty
что я медленнее, но я удивленin
.Ответы:
Я действительно смущен ответами, которые были даны - большинство из них просто неправильно. Конечно, у вас могут быть свойства объекта с неопределенными, нулевыми или ложными значениями. Таким образом, простое сокращение проверки собственности до
typeof this[property]
или, что еще хуже,x.key
даст вам полностью вводящие в заблуждение результаты.Это зависит от того, что вы ищете. Если вы хотите знать, содержит ли объект физически свойство (и оно не приходит откуда-то вверх по цепочке прототипов), тогда
object.hasOwnProperty
есть путь. Все современные браузеры поддерживают это. (Это отсутствовало в более старых версиях Safari - 2.0.1 и более ранних - но эти версии браузера редко используются больше.)Если вы ищете, если у объекта есть свойство, которое является итеративным (когда вы перебираете свойства объекта, оно появится), тогда выполните команду:
prop in object
даст вам желаемый эффект.Поскольку использование
hasOwnProperty
- это, вероятно, то, что вам нужно, и, учитывая, что вы можете использовать запасной метод, я представляю вам следующее решение:Вышеприведенное является работающим кросс-браузерным решением
hasOwnProperty
с одной оговоркой: он не может различить случаи, когда идентичное свойство находится в прототипе, и в экземпляре - он просто предполагает, что оно исходит из прототипа. Вы можете изменить его на более мягкий или строгий в зависимости от ситуации, но, по крайней мере, это должно быть более полезным.источник
var w = opts.w || 100;
. Но если вы что-то делаете в библиотеке, вам, возможно, придется пойти немного дальше в некоторых частях.__proto__
на ноль? Простой импл:function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }
(obj.constructor.prototype
следует добавить регистр с ).__proto__
нестандартен и не работает в некоторых старых браузерах. И даже с недавним добавлениемObject.getPrototypeOf
стандарта говорится, что вы все еще не можете изменить прототип существующего объекта.for(prop in object)
Цикл перебирает только перечисляемые свойства. Однакоprop in object
проверяет,object
есть ли свойствоprop
где-то в прототипной цепочке, независимо от того, является ли оно перечислимым или нет.С
Underscore.js
или ( даже лучше )lodash
:Какие вызовы
Object.prototype.hasOwnProperty
, но (а) короче, чтобы набрать, и (б) использует «безопасную ссылку наhasOwnProperty
» (т.е. он работает, даже еслиhasOwnProperty
перезаписан).В частности, lodash определяет
_.has
как:источник
npm install lodash.has
получить модуль npm с помощью толькоhas
функции, которая компилирует до 175 байтов при минимизации. Также полезно взглянуть на то,lodash.has/index.js
как работает очень популярная и надежная библиотека.lodash
's версии работают с этим:.has(undefined, 'someKey') => false
покаunderscore
возвращаетсяundefined
lodash
качестве «еще одной» зависимости: это довольно распространенная (если не самая распространенная) библиотека для такого рода вещей. Получайте удовольствие, изобретая велосипед.Что о?
источник
in
оператор или нет. Также обратите внимание, что уin
оператора есть отличная поддержка браузераIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
также проверяет свойства прототипа, в то время какhasOwnProperty
выполняет итерацию только пользовательских свойств. Ссылка: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…'key' in x
сделать работу с массивами. Доказательство: stackoverflow.com/questions/33592385/…Примечание : следующее в настоящее время в значительной степени устарело благодаря строгому режиму, и
hasOwnProperty
. Правильное решение - использовать строгий режим и проверять наличие свойства с помощьюobj.hasOwnProperty
. Этот ответ предшествует обеим этим вещам, по крайней мере, так широко реализованным (да, это так давно). Возьмите следующее как историческое примечание.Имейте в виду, что
undefined
(к сожалению) не является зарезервированным словом в JavaScript, если вы не используете строгий режим. Следовательно, кто-то (очевидно, кто-то еще) может иметь грандиозную идею переопределить его, взломав код.Поэтому более надежный метод заключается в следующем:
С другой стороны, этот метод гораздо более многословен, а также медленнее. : - /
Распространенной альтернативой является обеспечение того, что
undefined
она фактически не определена, например, путем помещения кода в функцию, которая принимает дополнительный вызываемый параметрundefined
, которому не передано значение. Чтобы убедиться, что значение не передано, вы можете сразу вызвать его самостоятельно, например:источник
void 0
как определено вернуть каноническоеundefined
, можно ли это сделатьx.attribute !== void 0
?(function (undefined) { // undefined is actually undefined here })();
Армин Роначер, кажется, уже победил меня , но:
Более безопасный, но медленнее решение, как было указано на Konrad Rudolph и Armin Ronacher будет:
источник
x.hasOwnProperty('toString') === true;
Object.prototype
уже есть встроенный, правильноhasOwnProperty
. Перезаписать его неверной реализацией (1. Свойства могут иметь значениеundefined
, 2. Это даст ложные срабатывания для унаследованных свойств) - просто ужасно плохая идея. Неправильные ответы могут и должны быть удалены. Я не знаю, сможете ли вы сделать это в сентябре 2008 года, когда увидели ответ Ресига , так что комментируйте, чтобы предложить сделать это сейчас.Вы можете использовать
in
оператор, чтобы проверить, существует ли свойство объекта:Вы также можете просмотреть все свойства объекта с помощью
for - in
цикла, а затем проверить наличие определенного свойства:Вы должны рассмотреть, является ли это свойство объекта перечислимым или нет, потому что не перечисляемые свойства не будут отображаться в
for-in
цикле. Кроме того, если свойство enumerable скрывает неперечислимое свойство прототипа, оно не будет отображаться в Internet Explorer 8 и более ранних версиях.Если вы хотите получить список всех свойств экземпляра, перечислимых или нет, вы можете использовать
Это вернет массив имен всех свойств, которые существуют в объекте.
Наконец, вы можете использовать оператор typeof для прямой проверки типа данных свойства объекта:
Если свойство не существует в объекте, оно вернет строку undefined. В противном случае он вернет соответствующий тип свойства. Тем не менее, обратите внимание, что это не всегда правильный способ проверки, имеет ли объект свойство или нет, потому что у вас может быть свойство, для которого установлено значение undefined, и в этом случае при использовании по-
typeof x.key
прежнему будет возвращаться значение true (даже если ключ по-прежнему в объекте).Обновление: Вы можете проверить, существует ли свойство, сравнивая с неопределенным свойством javascript
Это должно работать, если ключ не был специально установлен для
undefined
объекта xисточник
Давайте прорежем некоторую путаницу здесь. Во-первых, давайте упростим, предполагая, что
hasOwnProperty
уже существует; это верно для подавляющего большинства современных браузеров.hasOwnProperty
возвращает true, если переданное ему имя атрибута было добавлено к объекту. Он полностью не зависит от фактического значения, назначенного ему, которое может быть точноundefined
.Следовательно:
Однако:
Проблема в том, что происходит, когда объект в цепочке прототипов имеет атрибут со значением undefined?
hasOwnProperty
будет ложным за это, и так будет!== undefined
. Покаfor..in
что все равно перечислю это в перечислении.Суть в том, что нет кросс-браузерного способа (поскольку Internet Explorer не предоставляет
__prototype__
) для определения того, что определенный идентификатор не был прикреплен к объекту или чему-либо в его цепочке прототипов.источник
Если вы ищете недвижимость, тогда «НЕТ». Ты хочешь:
В общем случае вам не важно, является ли свойство прототипом или объектом.
Однако, поскольку вы использовали «ключ» в своем примере кода, похоже, вы рассматриваете объект как хеш, и в этом случае ваш ответ будет иметь смысл. Все ключи хешей будут свойствами объекта, и вы избежите дополнительных свойств, предоставленных прототипом.
Ответ Джона Резига был очень исчерпывающим, но я подумал, что он не ясен. Особенно, когда использовать «prop» в obj ».
источник
in
оператора есть отличная поддержка браузераIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
оператора: «он работает с« объектами »в узком смысле, поэтому объявлен как {} или создан с помощью конструктора, он не принимает массивы или примитивы. Не то, что OP этого требовал, но некоторые другие ответы представляют более широкие методы (работа с массивами, строками и т. д.) »Для тестирования простых объектов используйте:
if (obj[x] !== undefined)
Если вы не знаете, какой тип объекта он использует:
if (obj.hasOwnProperty(x))
Все остальные варианты медленнее ..
подробности
Оценка производительности 100 000 000 циклов под Nodejs для 5 вариантов, предложенных другими здесь:
Оценка говорит нам, что, если мы не хотим специально проверять цепочку прототипов объекта, а также сам объект, мы не должны использовать общую форму:
if (X in Obj)...
она в 2-6 раз медленнее в зависимости от варианта использованияВ итоге, если ваш Obj не обязательно является простым объектом и вы хотите избежать проверки цепочки прототипов объекта и убедиться, что x принадлежит непосредственно Obj, используйте 'if (obj.hasOwnProperty (x)) ...'.
В противном случае, если вы используете простой объект и не беспокоитесь о цепочке прототипов объекта, использование
if (typeof(obj[x]) !== 'undefined')...
является самым безопасным и быстрым способом.Если вы используете простой объект в качестве хеш-таблицы и никогда не делаете ничего странного, я бы использовал его, так
if (obj[x])...
как считаю его более читабельным.Радоваться, веселиться.
источник
Да, это так :) Я думаю, вы также можете сделать,
Object.prototype.hasOwnProperty.call(x, 'key')
что также должно работать, еслиx
есть свойство называетсяhasOwnProperty
:)Но это проверяет собственные свойства. Если вы хотите проверить, есть ли у него свойство, которое также может быть унаследовано, вы можете использовать его
typeof x.foo != 'undefined'
.источник
Потому что
не удается, если
x.key
разрешаетсяfalse
(например,x.key = ""
).источник
const x = {key: undefined};
который вернет false с этим решением, в то время какx.hasOwnProperty('key')); // true
иReflect.has(x, 'key')); // true
. Свойство действительно существует, но значение естьundefined
.Вы также можете использовать объект ES6
Reflect
:Документацию по MDN для
Reflect.has
можно найти здесь .источник
ОК, похоже, у меня был правильный ответ, если только вы не хотите наследовать свойства:
Вот некоторые другие опции для включения унаследованных свойств:
источник
var x = { key: false };
вx.key
методе было бы неправильно.Не делайте этого
object.hasOwnProperty(key))
, это действительно плохо, потому что эти методы могут быть затенены свойствами рассматриваемого объекта - подумайте{ hasOwnProperty: false }
- или объект может быть нулевым объектом(Object.create(null))
.Лучший способ это сделать
Object.prototype.hasOwnProperty.call(object, key)
или:источник
Еще один относительно простой способ использования
Object.keys
. Это возвращает,array
что означает, что вы получаете все функции массива.Хотя мы находимся в мире с отличной поддержкой браузера. Поскольку этот вопрос настолько старый, я подумал, что добавлю это: Это безопасно для использования с JS v1.8.5
источник
Object.keys(info).indexOf('someotherthing') !== -1
hasOwnProperty "может использоваться, чтобы определить, имеет ли объект указанное свойство как прямое свойство этого объекта; в отличие от оператора in , этот метод не проверяет цепочку прототипов объекта".
Так что, скорее всего, для того, что кажется вашим вопросом, вы не хотите использовать hasOwnProperty, который определяет, существует ли свойство как прикрепленное непосредственно к самому объекту. .
Если вы хотите определить, существует ли свойство в цепочке прототипов, в которой вы хотите использовать, например:
Надеюсь, это поможет.
источник
С риском массового понижения голосов, вот еще один вариант для конкретного случая. :)
Если вы хотите проверить член на объекте и хотите узнать, было ли для него установлено что-то отличное от:
тогда вы можете использовать:
источник
ECMA Script 6 решение с отражением. Создайте обертку как:
источник
Существует метод «hasOwnProperty» для объекта, но не рекомендуется вызывать этот метод напрямую, потому что иногда объект может иметь значение null или какое-либо свойство существует для объекта, например:
{ hasOwnProperty: false }
Так что лучшим способом будет:
источник
Вы можете использовать следующие подходы:
Разница между следующими подходами заключается в следующем:
источник
Вам нужно использовать метод
object.hasOwnProperty(property)
. Возвращает true, если объект имеет свойство, и false, если объект не имеет.источник
Если проверяемый вами ключ хранится в переменной , вы можете проверить его следующим образом:
источник
Зачем слишком усложнять вещи, когда вы можете сделать:
Просто и понятно в большинстве случаев ...
источник
const objectName = { keyname: false };
он должен вернуть true, такkeyname
как является свойствомobjectname
. Но так как значение ложно, это вернет ложь с этой логикой.