【问题标题】:Why does obj.prop return true when obj.hasOwnProperty('prop') returns false? [duplicate]当 obj.hasOwnProperty('prop') 返回 false 时,为什么 obj.prop 返回 true? [复制]
【发布时间】:2016-03-29 16:59:30
【问题描述】:

我正在使用 NodeJS 和 Mongoose。我从数据库中得到了一组数组(我们称之为results[][])。

我只想测试每个数组中包含的对象是否具有 game_id 属性(随机正整数)。

我像往常一样尝试了一个简单的条件:

for (i = 0; i < results.length; i += 1) {
    if(results[i][0].hasOwnProperty('game_id')) {
        console.log('OK ?');
    }
}

但我从未通过条件...这很奇怪,因为如果我转储对象,我会看到 game_id 属性。

所以我尝试了这个:

for (i = 0; i < results.length; i += 1) {
    if(results[i][0].hasOwnProperty('game_id')) {
        console.log('[' + i + '] Test 1: ' + results[i][0].game_id);
    }
    if(results[i][0].game_id) {
        console.log('[' + i + '] Test 2: ' + results[i][0].game_id);
    }
}

得到:

[0] Test 2: 123
[1] Test 2: 456
[2] Test 2: 789
[3] Test 2: 1011

我不明白...

results[i][0].game_id 为真时,为什么results[i][0].hasOwnProperty('game_id') 返回假?那里发生了什么?

【问题讨论】:

  • 你的对象有继承吗?你能用一个简单的小提琴重现这个问题吗?
  • 在此处添加结果 JSON。
  • @Jamiec 不,我不能因为猫鼬。我在这里发现了同样的问题stackoverflow.com/questions/30923378/…

标签: javascript properties


【解决方案1】:

我认为会发生这种情况的唯一方法是game_id 属性是通过原型链进入的。 hasOwnProperty 如果该属性不属于被枚举的实际对象,则该属性将返回 false,但它很可能仍具有来自原型的属性/值。

以下代码演示了这一点:

function CreateObject(){    
}
CreateObject.prototype = {
       game_id:123
    };

var arr = [
	new CreateObject(), new CreateObject()
];

for(var i = 0;i<arr.length;i++){
   if(arr[i].hasOwnProperty('game_id')) {
        console.log('[' + i + '] Test 1: ' + arr[i].game_id);   // not logged
    }
    if(arr[i].game_id) {
        console.log('[' + i + '] Test 2: ' + arr[i].game_id); // logged
    }
}

【讨论】:

猜你喜欢
  • 2015-06-22
  • 2021-11-10
  • 2011-05-22
  • 2021-07-02
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2019-02-08
  • 2013-09-18
相关资源
最近更新 更多