当 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 [重复]