当 obj.hasOwnProperty('prop') 返回 false 时,为啥 obj.prop 返回 true? [复制]

Posted

技术标签:

【中文标题】当 obj.hasOwnProperty(\'prop\') 返回 false 时,为啥 obj.prop 返回 true? [复制]【英文标题】: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 不,我不能因为猫鼬。我在这里发现了同样的问题***.com/questions/30923378/… 【参考方案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
    

【讨论】:

谢谢!你说得对。这是因为 Mongoose 模式。这里已经有答案了:***.com/questions/30923378/…

以上是关于当 obj.hasOwnProperty('prop') 返回 false 时,为啥 obj.prop 返回 true? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

obj.hasOwnProperty 即使在创建属性后也总是返回 false [重复]

TypeScript hasOwnProperty 等效项

Object.hasOwnProperty

jQuery--- .hasOwnProperty 用法

对象没有 hasOwnProperty 方法(即未定义) - IE8

jsObject.prototype.hasOwnProperty()