2013-06-17 2 views
9

С hasOwnProperty имеет некоторые оговорки и причуды (окно/широкое использование в проблемах ie8/etc).Преимущество использования Object.hasOwnProperty против тестирования, если свойство не определено

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

Например:

var obj = { a : 'here' }; 

if (obj.hasOwnProperty('a')) { /* do something */ } 

if (obj.a !== undefined) { /* do something */ } 
// or maybe (typeof (obj.a) !== 'undefined') 

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

Я также видел этот прототип переписана для hasOwnProperty, который работает, но я не продал на его полезности ...

if (!Object.prototype.hasOwnProperty) { 
    Object.prototype.hasOwnProperty = function(prop) { 
     var proto = this.__proto__ || this.constructor.prototype; 
     return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]); 
    }; 
} 
+1

Что-нибудь другое, чем при использовании 'hasOwnProperty' гарантирует получение ложных срабатываний или негативов – Xotic750

+0

, если я знаю Я ищу массив или объект или функцию, я предпочитаю его еще проще: if (obj.a). Конечно, если obj.a может быть нулевым, "" или ложным, то сравнение его должно быть! == undefined требуется. Кроме того, этот объект имеет «a» в соответствии с («a» в obj), но не if (obj.a): {a: undefined} – dandavis

+1

Дополнительная информация: Этот тест jsPerf может показаться интересным: http: // jsperf .com/hasownproperty-против-в/2. Итог: '.hasOwnProperty' ** много ** медленнее, чем любой другой способ тестирования свойства существования (что было для меня неожиданным TBH). –

ответ

3

В качестве дополнительной информации к ответу, предоставленному @Pavel Gruba, и полифайлу, который вы предоставили. Насколько я знаю, нет хорошего способа полифила hasOwnProperty для браузеров, которые не поддерживают его. Я видел довольно много разных в дикой природе, и все они производят ложные срабатывания или негативы. Если у меня нет абсолютно никакой альтернативы, то это то, что я создал для моего использования, он также страдает ложными срабатываниями и негативами. Согласно MSDN.

Поддерживается в следующих режимах документов: Причуды Internet Explorer 6 стандартов, Internet Explorer 7 стандартов Internet Explorer 8 стандарты , Internet Explorer 9 стандартов, Internet Explorer 10 стандартов. Также поддерживается в приложениях Windows Store.

Javascript

function is(x, y) { 
    if (x === y) { 
     if (x === 0) { 
      return 1/x === 1/y; 
     } 

     return true; 
    } 

    var x1 = x, 
     y1 = y; 

    return x !== x1 && y !== y1; 
} 

function hasOwnProperty(object, property) { 
    var prototype; 

    return property in object && (!(property in (prototype = object.__proto__ || object.constructor.prototype)) || !is(object[property], prototype[property])); 
} 

function NewClass() {} 
NewClass.prototype = { 
    a: 'there' 
}; 

var obj = new NewClass(); 

if (obj.hasOwnProperty("a")) { 
    console.log("has property") 
} 

if (hasOwnProperty(obj, "a")) { 
    console.log("has property") 
} 

На jsfiddle

12

Метод hasOwnProperty проверяет, что свойство присваивается непосредственно объекту , Итак, если свойство 'a' находится в прототипе hasOwnProperty, оно будет фильтровать это.

function NewClass() {} 
NewClass.prototype = { a: 'there' }; 
var obj = new NewClass(); 

if (obj.hasOwnProperty('a')) { /* code does not work */ } 
if (obj.a !== undefined) { /* code works */ } 

Таким образом, hasOwnProperty во многих случаях безопаснее.

+0

Очень верно ... Просто осознал это после задание вопроса! Мне сложно найти поддержку браузера для hasOwnProperty, по крайней мере, это IE7 +? –

5

hasOwnProperty не проверяет неопределенных значений только проверяет, является ли свойство asigned к объекту, даже если не определено

var obj = { a : undefined }; 
obj.hasOwnProperty("a") //true 
obj.a === undefined  //true 
obj.hasOwnProperty("b") //false 
obj.b === undefined  //true 
Смежные вопросы