Следующие два утверждения дают одинаковый результат? Есть ли причина предпочитать один путь другому?
if (key in object)
if (object.hasOwnProperty(key))
javascript
Лорейн Бернард
источник
источник
in will also return true if key gets found somewhere in the prototype chain
. ты можешь написать пример? Спасибо.({foo:"bar"}).hasOwnProperty("toString")
против"toString" in ({foo:"bar"})
Я попытаюсь объяснить другим примером. Скажем, у нас есть следующий объект с двумя свойствами:
Давайте создадим экземпляр TestObj:
Давайте рассмотрим экземпляр объекта:
Вывод:
Оператор in возвращает true всегда, если свойство доступно для объекта, напрямую или из прототипа
hasOwnProperty () возвращает true, только если свойство существует в экземпляре, но не в его прототипе
Если мы хотим проверить, существует ли какое-либо свойство в прототипе, логически, мы бы сказали:
В заключение:
Итак, что касается утверждения, что эти два условия ...
... дать тот же результат, ответ очевиден, это зависит.
источник
in
также проверит наличие унаследованных свойств, чего нельзя сказать оhasOwnProperty
.источник
Таким образом,
hasOwnProperty()
не выглядит в прототипе,in
но выглядит в прототипе.Взято из высокопроизводительного Javascript от O'Reilly :
источник
Вы получили несколько действительно хороших ответов. Я просто хочу предложить что-то, что избавит вас от необходимости проверять «hasOwnProperty» во время итерации объекта.
При создании объекта люди обычно создают его следующим образом:
Теперь, если вы хотите перебрать «someMap», вам придется сделать это следующим образом:
Мы делаем это, чтобы избежать перебора унаследованных свойств.
Если вы намереваетесь создать простой объект, который будет использоваться только как «карта» (т. Е. Пары ключ-значение), вы можете сделать это следующим образом:
Так что теперь будет безопасно повторять так:
Я узнал этот удивительный совет здесь
источник
(из Javascript Крокфорда : хорошие части )
источник
in
Оператор отличается отfor-in
заявления.in
это ключевое слово. Но ОП спрашивает о конкретном использовании в качествеin
оператора. Ваш ответ касается другого использования как частиfor-in
утверждения.Первая версия короче (особенно в минимизированном коде, где переменные переименованы)
против
В любом случае, как сказал @AndreMeinhold, они не всегда дают один и тот же результат.
источник