如果未定义Property,则使用Object.hasOwnProperty与测试的好处

Mar*_*.io 13 javascript jquery object undefined hasownproperty

因为hasOwnProperty有一些警告和怪癖(窗口/广泛使用ie8问题/等).

我想知道是否有任何理由甚至使用它,如果只是测试一个属性是否未定义更合理和更简单.

例如:

var obj = { a : 'here' };

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

if (obj.a !== undefined) { /* do something */ }
// or maybe (typeof (obj.a) !== 'undefined')
Run Code Online (Sandbox Code Playgroud)

只是想知道是否有人对此有任何好的见解,我更愿意使用最跨浏览器的友好和最新的方法.

我也看过这个原型覆盖了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]);
    };
}
Run Code Online (Sandbox Code Playgroud)

小智 13

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 */ }
Run Code Online (Sandbox Code Playgroud)

因此,hasOwnProperty在许多情况下更安全.


dpi*_*eda 9

hasOwnProperty不检查未定义的值,只检查属性是否与对象一致,即使未定义

var obj = { a : undefined }; 
obj.hasOwnProperty("a") //true 
obj.a === undefined     //true
obj.hasOwnProperty("b") //false
obj.b === undefined     //true   
Run Code Online (Sandbox Code Playgroud)


Xot*_*750 4

作为Pavel Gruba给出的答案以及您提供的 Polyfil 的进一步信息:

据我所知,对于 hasOwnProperty 本身不支持polyfil的浏览器来说,没有什么好的方法。我在野外见过很多不同的情况,它们都会产生误报或误报。如果我绝对没有其他选择,那么这就是我创建的供我使用的东西,但它也会遭受误报和误报。根据MSDN

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

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")
}
Run Code Online (Sandbox Code Playgroud)

在 JSFiddle 上