Как проверить, есть ли у объекта свойство в JavaScript? - PullRequest
1316 голосов
/ 25 сентября 2008

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

Рассмотрим:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

Это лучший способ сделать это?

Ответы [ 24 ]

12 голосов
/ 16 декабря 2016

Для тестирования простых объектов используйте: if (obj[x] !== undefined)

Если вы не знаете, какой тип объекта он использует: if (obj.hasOwnProperty(x))

Все остальные параметры медленнее ..

Детали

Оценка производительности 100 000 000 циклов под Nodejs для 5 вариантов, предложенных другими здесь:

function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }

Оценка говорит нам, что если мы не хотим специально проверять цепочку прототипов объекта, а также сам объект, мы не должны использовать общую форму: if (X in Obj)... Это в 2-6 раз медленнее в зависимости от случай использования

hasKey1 execution time: 4s 510.427785ms
hasKey2 execution time: 0s 904.374806ms
hasKey3 execution time: 0s 760.336193ms
hasKey4 execution time: 0s 935.19901ms
hasKey5 execution time: 2s 148.189608ms

Итог: если ваш Obj не обязательно является простым объектом и вы хотите избежать проверки цепочки прототипов объекта и убедиться, что x принадлежит непосредственно Obj, используйте 'if (obj.hasOwnProperty (x)) ...' .

В противном случае, если вы используете простой объект и не беспокоитесь о цепочке прототипов объекта, использование if (typeof(obj[x]) !== 'undefined')... - самый безопасный и быстрый способ.

Если вы используете простой объект в качестве хеш-таблицы и никогда не делаете ничего странного, я бы использовал if (obj[x])..., так как я нахожу его гораздо более читабельным.

Веселитесь.

12 голосов
/ 26 октября 2016

Вы также можете использовать ES6 Reflect объект :

x = {'key': 1};
Reflect.has( x, 'key'); // returns true

Документацию по MDN для Reflect.has можно найти здесь .

Статический метод Reflect.has() работает как в операторе как функция.

8 голосов
/ 25 сентября 2008

ОК, похоже, у меня был правильный ответ, если только вы не хотите наследовать свойства:

if (x.hasOwnProperty('key'))

Вот некоторые другие опции для включения унаследованных свойств:

if (x.key) // Quick and dirty, but it does the same thing as below.

if (x.key !== undefined)
6 голосов
/ 24 сентября 2015

hasOwnProperty "может использоваться, чтобы определить, имеет ли объект указанное свойство как прямое свойство этого объекта; в отличие от оператора in , этот метод не проверяет цепочку прототипов объекта."

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

Если вы хотите определить, существует ли свойство в цепочке прототипов, в которой вы хотите использовать, например:

if( prop in object ){ // do something }

Надеюсь, это поможет.

5 голосов
/ 29 мая 2015

Другим относительно простым способом является использование Object.keys. Это возвращает array, что означает, что вы получаете все функции массива.

var noInfo = {};
var info = {something: 'data'};

Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true

Хотя мы находимся в мире с отличной поддержкой браузера. Поскольку этот вопрос настолько стар, я подумал, что добавлю это: Это безопасно для использования с JS v1.8.5

4 голосов
/ 18 апреля 2018

Не делайте этого object.hasOwnProperty(key)), это действительно плохо, потому что эти методы могут быть затенены свойствами рассматриваемого объекта - рассмотрим { hasOwnProperty: false } - или объект может быть нулевым объектом (Object.create(null)).

Лучше всего сделать Object.prototype.hasOwnProperty.call(object, key) или:

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));
2 голосов
/ 04 сентября 2018

Почему все усложняется, когда вы можете сделать:

var isProperty =  (objectname.keyname || "") ? true : false;

Просто и понятно в большинстве случаев ...

2 голосов
/ 08 ноября 2017

Существует метод "hasOwnProperty" для объекта, но не рекомендуется вызывать этот метод напрямую, поскольку иногда объект может иметь значение null или какое-либо свойство существует для объекта, например: { hasOwnProperty: false }

Так что лучше было бы:

// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));
2 голосов
/ 19 декабря 2016

ECMA Script 6 решение с отражением. Создайте упаковку как:

/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj    The object or array to be searched.
@param key    The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
   "use strict";
   var retVal = (typeof defVal === 'undefined' ? "" : defVal);
   if ( Reflect.has( obj, key) ) {
       return Reflect.get( obj, key);
   }
   return retVal;
}  // getSafeReflectArg
2 голосов
/ 12 июля 2016

С риском массового понижения голосов, вот еще один вариант для конкретного случая. :)

Если вы хотите проверить член на объекте и хотите узнать, было ли ему установлено что-то отличное от:

  • ''
  • ложь
  • 1010 * нуль *
  • 1012 * не определено *
  • 0 ...

тогда вы можете использовать:

var foo = {};
foo.bar = "Yes, this is a proper value!";
if (!!foo.bar) {
        // member is set, do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...