Javascript 使用Object.hasOwnProperty与测试未定义属性的好处

Javascript 使用Object.hasOwnProperty与测试未定义属性的好处,javascript,jquery,object,undefined,hasownproperty,Javascript,Jquery,Object,Undefined,Hasownproperty,由于hasOwnProperty有一些注意事项和怪癖(在Internet Explorer 8问题中的窗口/广泛使用等): 有什么理由使用它吗?如果只是测试一个属性是否未定义,它是否更合理、更简单 例如: var obj = { a : 'here' }; if (obj.hasOwnProperty('a')) { /* do something */ } if (obj.a !== undefined) { /* do something */ } // Or maybe (typeof

由于hasOwnProperty有一些注意事项和怪癖(在Internet Explorer 8问题中的窗口/广泛使用等):

有什么理由使用它吗?如果只是测试一个属性是否未定义,它是否更合理、更简单

例如:

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]);
    };
}

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在许多情况下更安全。

关于给出的答案以及您提供的polyfil的进一步信息:

据我所知,对于本机不支持polyfil
hasOwnProperty的浏览器,没有什么好方法可以使用它。我在野外见过很多不同的,它们都会产生假阳性或假阴性。如果我完全没有选择,那么这就是我为我的使用而创建的,但它也会遭受误报和否定。根据

以下文档模式支持:怪癖、Internet Explorer 6 标准,Internet Explorer 7标准,Internet Explorer 8 标准,Internet Explorer 9标准,Internet Explorer 10 标准。在Windows应用商店应用程序中也受支持

JavaScript
.

hasOwnProperty不检查未定义的值。它仅检查是否将特性指定给对象,即使未定义:

var obj = { a : undefined };
obj.hasOwnProperty("a") // true
obj.a === undefined     // true
obj.hasOwnProperty("b") // false
obj.b === undefined     // true

除了使用
hasOwnProperty
之外的任何东西都会产生误报或误报如果我知道我在寻找数组、对象或函数,我更喜欢它更简单:if(obj.a)。当然,如果obj.a可以是零、“、或false,那么将其比较为!==未定义是必需的。另外,这个对象有一个“a”,根据(obj中的“a”),但不是if(obj.a):{a:undefined}附加信息:您可能会发现这个jsPerf测试很有趣:。一句话:
.hasOwnProperty
比任何其他测试属性存在性的方法都要慢得多(这对我来说很奇怪)。然而,
.hasOwnProperty
中的
具有非常不同的含义。引用:
“obj.hasOwnProperty(prop)”用于确定对象是否将指定属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链。
非常正确。。。在发布问题后才意识到这一点!我很难找到hasOwnProperty的浏览器支持,它至少与IE7+兼容吗?
var obj = { a : undefined };
obj.hasOwnProperty("a") // true
obj.a === undefined     // true
obj.hasOwnProperty("b") // false
obj.b === undefined     // true