Я должен поставить проверку достоверности перед выполнением любой операции с использованием объекта, который -

  1. Если этот объект существует.
  2. Если он существует, то для него также существует определенное свойство.

Для бывших

var obj = {
    key: "value"
}

Теперь самый обычный способ сделать это

if(obj) {
    if(obj.hasOwnProperty('key') {
        //Do some action (validity check pass)
        //For Example- console.log(obj.key);
    }
}

Но я ищу более быстрый и эффективный способ решить эту проблему.

1
Karan Hudia 29 Авг 2017 в 17:28

4 ответа

Лучший ответ

Я бы сделал:

if ( typeof obj != "undefined" && obj.hasOwnProperty('key') ) 
{ 
    console.log('found'); 
} 
else 
{ 
    console.log('not found');
}
1
Stuart 29 Авг 2017 в 14:35

Если вы заботитесь о цепочке прототипов, то нет лучшего способа; Вы должны проверить каждую ссылку в цепочке вниз.

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

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

Для меня это "пахнет", как две отдельные проблемы: "Существует ли объект?", Если да, укажите значение по умолчанию и "Есть ли у объекта это свойство?", Бизнес-логика.

Если это так, используйте стандартный шаблон для установки значения по умолчанию: "obj = obj || {};" например; и тогда тест становится единым вызовом, который трудно сделать «быстрее».

0
Odalrick 29 Авг 2017 в 14:47

Вы можете определенно объединить два оператора в одно, как упоминали @Stuart и @phuzi:

if(!!obj && obj.hasOwnProperty('key')

Также hasOwnProperty будет игнорировать все унаследованные свойства, которые передаются через прототип. Если вы предпочтете включить унаследованные свойства, { Оператор {X1}} можно использовать здесь.

if (!!ob && (prop in ob))
1
Laszlo 29 Авг 2017 в 14:46

Как это ?

var obj = {
    key: "value"
}
var objx = null;


if(obj && "key" in obj){
	document.getElementById("check_one").innerHTML = "is valid";
}else{
	document.getElementById("check_one").innerHTML ="is not valid";
}
if(obj && "notkey" in obj){
	document.getElementById("check_two").innerHTML = "is valid";
}else{
	document.getElementById("check_two").innerHTML ="is not valid";
}

if(objx && "key" in objx){
	document.getElementById("check_three").innerHTML = "is valid";
}else{
	document.getElementById("check_three").innerHTML ="is not valid";
}
<p>
Check One (should be valid): <span id="check_one"></span>
</p>
<p>
Check Two (should be invalid): <span id="check_two"></span>
</p>
<p>
Check Three (should be invalid) <span id="check_three"></span>
</p>

В зависимости от необходимой поддержки браузера вы также можете использовать Reflect.has

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has

Нравится

Reflect.has(obj, 'key');

Если вы хотите поддерживать старые IE, я думаю, вам придется использовать HasOwnProperty, другой возможности не будет - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

1
subkonstrukt 29 Авг 2017 в 14:40