首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for..in和hasOwnProperty

for..in和hasOwnProperty
EN

Stack Overflow用户
提问于 2012-10-04 20:55:56
回答 4查看 44.5K关注 0票数 80

可能重复: 如何检查对象是否在JavaScript中具有特定属性?

我在Twitter的JavaScript文件中找到了以下片段。为什么他们需要调用hasOwnProperty函数才能看到dict具有key属性?for循环是针对“dict”中的每个“key”运行的,意思是“dict”有“key”。我漏掉了一点吗?

代码语言:javascript
复制
function forEach(dict, f) {
    for (key in dict) {
        if (dict.hasOwnProperty(key))
            f(key, dict[key]);
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-04 20:57:34

因为如果不这样做,它将遍历prototype链上的每个属性,包括那些您不知道的属性(这些属性可能是由处理本机对象原型的人添加的)。

这样,您就只能获得对象实例本身上的密钥。

票数 79
EN

Stack Overflow用户

发布于 2012-10-04 21:09:08

hasOwnProperty方法让您知道属性是直接在对象的实例上,还是从其原型链继承过来的。

考虑以下几点

代码语言:javascript
复制
function ObjWithProto() {
    this.foo = 'foo_val';
}

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

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

也就是说,您有一个带有属性( dict )和属性( foo )和属性( foobar )的对象,该对象还从其原型链继承属性bar

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

代码语言:javascript
复制
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);

你会看到

代码语言:javascript
复制
has foo foo_val
has foobar foobar_val
not bar bar_val

这使您可以分离对象本身的属性和它继承的属性(通常是与循环无关的方法)。

此外,如果现在执行dict.bar = 'new_bar_val';,最后的结果将更改为has bar new_bar_val,甚至可以区分与继承的属性同名的属性。

票数 36
EN

Stack Overflow用户

发布于 2012-10-04 20:59:19

JavaScript中的每个对象都是字典。这意味着"toString“和所有其他方法都是每个对象的关键:

代码语言:javascript
复制
var myObj = {};
console.log(myObj["toString"]);

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

代码语言:javascript
复制
"toString" in myObj; // true
myObj.hasOwnProperty("toString") // false
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12735778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档