for..in和hasOwnProperty

可能重复:
如何检查一个对象是否有Javascript中的属性?

我在Twitter的JS文件中找到以下代码片段。 我想知道为什么他们需要调用hasOwnProperty函数来查看'dict'是否具有'key'属性? for循环为'dict'中的每个'key'运行,这意味着'dict'有'key',我错过了一个点吗?

function forEach(dict, f) {
    for (key in dict) {
        if (dict.hasOwnProperty(key))
            f(key, dict[key]);
    }
}

因为如果你不这样做,它会循环遍历原型链上的每个属性,包括那些你不知道的属性(可能是有人用本机对象原型搞乱了)。

这样你只能保证那个对象实例本身的密钥。


hasOwnProperty方法让你知道一个属性是直接在一个对象的实例上还是从它的原型链继承而来。

考虑以下

function ObjWithProto() {
    this.foo = 'foo_val';
}

ObjWithProto.prototype = {bar: 'bar_val'};

var dict = new ObjWithProto();
dict.foobar = 'foobar_val';

即你有一个带有属性foofoobar的Object dict ,它也从它的原型链继承一个属性bar

现在运行它(修改版本)的代码

function forEach(dict) {
    var key;
    for (key in dict) {
        if ( dict.hasOwnProperty(key) ) console.log('has', key, dict[key]);
        else console.log('not', key, dict[key]);
    }
}
forEach( dict );

你会看见

has foo foo_val
has foobar foobar_val
not bar bar_val

这可以让你分离一个对象本身和它已经继承的属性(这些属性通常是与循环无关的方法)

此外,如果你现在做dict.bar = 'new_bar_val'; ,最后的结果会变成has bar new_bar_val ,让你甚至可以区分与继承的同名属性。


javascript上的每个对象都是一个字典,这意味着“toString”和其他方法是每个对象的关键

var myObj = {};
console.log(myObj["toString"]);

但是这个函数是从Object类继承的,所以hasOwnProperty告诉你这个键是由字典拥有的还是继承的。

"toString" in myObj; // true
myObj.hasOwnProperty("toString") // false
链接地址: http://www.djcxy.com/p/27305.html

上一篇: for..in and hasOwnProperty

下一篇: How do I check if an object has a key in JavaScript?