быстрый ответ
Как проверить, существует ли определенный ключ в объекте или массиве 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]]. Это намного быстрее!
эталонный тест
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
,
Использование
в операторе
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
потому, что в начальный момент подтверждается, что свойство не имеет значения.
Для сравнения:
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[].
Советовать
Избегайте объектов со undefined
значениями. Проверяйте напрямую, когда это возможно, и используйте null
для инициализации значений свойств. В противном случае используйте медленный in
оператор или hasOwnProperty()
метод.
РЕДАКТИРОВАТЬ: 12/04/2018 - НЕ ОТНОСИТЕЛЬНО больше
Как прокомментировали люди, современные версии движков Javascript (за исключением Firefox) изменили подход к свойствам доступа. Текущая реализация медленнее, чем предыдущая, для этого конкретного случая, но разница между ключом доступа и объектом незначительна.