当obj.hasOwnProperty(' prop')返回false时,为什么obj.prop返回true?

时间:2015-12-23 09:41:13

标签: javascript properties

我正在使用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].hasOwnProperty('game_id')为真时,为什么results[i][0].game_id会返回false?那里发生了什么?

1 个答案:

答案 0 :(得分:1)

我认为发生这种情况的唯一方法是game_id属性是否通过原型链进入。如果hasOwnProperty不属于枚举的实际对象,则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 } }将返回false,但它仍可能具有原型中的属性/值。

以下代码演示了这一点:

&#13;
&#13;
while (netInfo == null || !netInfo.isConnected()) {
    new AlertDialog.Builder(this)
            .setTitle("title")
            .setMessage("message")
            .setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                    netInfo = cm.getActiveNetworkInfo();
                    System.out.println("cm: "+cm+ " netinfo: "+ netInfo);
                }
            })
            .show();
}
&#13;
&#13;
&#13;