Проверка наличия ключа в объекте JavaScript.

javascript arrays object


Как проверить,существует ли определенный ключ в объекте JavaScript или массиве?

Если ключа не существует,и я пытаюсь получить к нему доступ,он вернётся ложным? Или выкинет ошибку?




Answer 1 Ates Goral


Проверка на неопределенность не является точным способом проверки существования ключа. Что если ключ существует, но значение на самом деле undefined ?

var obj = { key: undefined };
obj["key"] !== undefined // false, but the key exists!

Вместо этого вы должны использовать оператор in :

"key" in obj // true, regardless of the actual value

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

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

Или, если вы хотите особенно проверить свойства экземпляра объекта (а не наследуемые свойства), используйте hasOwnProperty :

obj.hasOwnProperty("key") // true

Для сравнения производительности между методами, которые in , hasOwnProperty и ключ не undefined , см этого теста




Answer 2 rdllopes


быстрый ответ

Как проверить,существует ли определенный ключ в объекте JavaScript или массиве? Если ключа не существует и я пытаюсь получить к нему доступ,будет ли он возвращать false? Или выкинет ошибку?

Прямой доступ к отсутствующему свойству с использованием (ассоциативного) стиля массива или стиля объекта вернет неопределенную константу.

Медленный и надежный в операторе и метод hasOwnProperty

Как уже упоминалось здесь,вы можете иметь объект со свойством,связанным с "неопределенной" константой.

 var bizzareObj = {valid_key:  undefined};

В этом случае вам придется использовать hasOwnProperty или в операторе , чтобы знать , если ключ действительно есть. Но, но по какой цене?

так что,говорю тебе...

in operator и hasOwnProperty являются «методами», которые используют механизм дескриптора свойства в Javascript (аналогично отражению Java в языке Java).

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

Тип дескриптора свойства используется для объяснения манипулирования и повторного использования атрибутов именованных свойств. Значения типа дескриптора свойства представляют собой записи, состоящие из именованных полей, где каждое имя поля является именем атрибута, а его значение является соответствующим значением атрибута, как указано в 8.6.1. Кроме того, любое поле может присутствовать или отсутствовать.

С другой стороны,вызов метода или ключа объекта будет использовать механизм Javascript [[Get]].Это намного быстрее!

benchmark

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

Comparing key access in JS.

Использование в операторе
var result = "Impression" in array;

В результате

12,931,832 ±0.21% ops/sec      92% slower 
Использование hasOwnProperty
var result = array.hasOwnProperty("Impression")

В результате

16,021,758 ±0.45% ops/sec     91% slower
Непосредственный доступ к элементам (стиль кронштейнов)
var result = array["Impression"] === undefined

В результате

168,270,439 ±0.13 ops/sec     0.02% slower 
Прямой доступ к элементам (стиль объекта)
var result = array.Impression  === undefined;

В результате

168,303,172 ±0.20%     fastest

РЕДАКТИРОВАТЬ: По какой причине присваивать свойству undefined значение?

Этот вопрос озадачивает меня. В Javascript есть по крайней мере две ссылки на отсутствующие объекты, чтобы избежать таких проблем: null и undefined .

null - это примитивное значение, которое представляет собой намеренное отсутствие какого-либо значения объекта или, в краткосрочной перспективе, подтвержденное отсутствие значения. С другой стороны, undefined - это неизвестное значение (не определено). Если есть свойство, которое будет использоваться позже с правильным значением, рассмотрите использование null ссылки вместо undefined поскольку в начальный момент подтверждается, что у свойства отсутствует значение.

Compare:

var a = {1: null}; 
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.:  the value is defined. 
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].

Advise

Избегайте объектов с undefined значениями. Проверяйте напрямую, когда это возможно, и используйте null для инициализации значений свойств. В противном случае используйте оператор slow in или hasOwnProperty() .

РЕДАКТИРОВАНИЕ:12/04/2018-БОЛЬШЕ НЕ АКТУАЛЬНО

Как прокомментировали люди,современные версии движков Javascript (с исключением Firefox)изменили подход к свойствам доступа.Текущая реализация для данного случая медленнее,чем предыдущая,но разница между ключом доступа и объектом пренебрежимо мала.




Answer 3 Eli Courtwright


Он вернет undefined .

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefined - это специальное постоянное значение. Так что вы можете сказать, например,

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

Это, вероятно, лучший способ проверить отсутствие ключей. Однако, как указано в комментарии ниже, теоретически возможно, что вы хотите, чтобы фактическое значение было undefined . Мне никогда не нужно было этого делать, и я не могу придумать причину, почему я бы этого хотел, но ради полноты вы можете использовать оператор in

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}



Answer 4 handle


Принятый ответ относится к объекту . Остерегайтесь использования оператора in для Array для поиска данных вместо ключей:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

Чтобы проверить существующие элементы в массиве: лучший способ узнать, находится ли элемент в массиве JavaScript?




Answer 5 user2320522


"key" in obj

Скорее всего,проверяются только те значения атрибутов объектов,которые сильно отличаются от ключей массива.