Javascript对象访问者的怪异

Bri*_*bin 3 javascript object

所以我一直遇到一个javascript对象的奇怪问题.也许这只是缺乏知识(相对较新的JS),或JS的奇怪世界的一部分,但它在这里:

每当我尝试检查对象是否具有某些属性时,即:

var someObject = {};
var someArray = ['cat', 'cat', 'cat', 'dog', 'dog', 'dog', 'cow', 'horse'];
someArray.some(function(animal, index) {
    if (!someObject[animal]) {
        someObject[animal] = index;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我没有弄错的话,预期的输出应该如下:

someObject = {
    'cat': 0,
    'dog': 3,
    'cow': 6,
    'horse': 7
}
Run Code Online (Sandbox Code Playgroud)

但是我得到的是:

someObject = {
    'cat': 1,
    'dog': 3,
    'cow': 6,
    'horse': 7
}
Run Code Online (Sandbox Code Playgroud)

笏.

此外,当我切换到使用以下内容时,问题得到解决:

someArray.some(function(animal, index) {
     if (!someObject.hasOwnProperty(animal)) {
        someObject[animal] = index;
     }
  });
Run Code Online (Sandbox Code Playgroud)

WAT.不是因为我已经找到了上面的解决方案,这不是一个问题,我只是好奇我是否不理解对象[property]功能是如何工作的?谢谢!

Jam*_*rpe 7

在第一次迭代中,它将传递if语句并因此分配它:

someobject['cat'] = 0;
Run Code Online (Sandbox Code Playgroud)

在下一个,它正在做:

if (someobject['cat']) ...
Run Code Online (Sandbox Code Playgroud)

这是:

if (0) ...
Run Code Online (Sandbox Code Playgroud)

并且0是假的,所以它再次将它分配给下一个索引,即1.

使用替代方法,hasOwnProperty检查它是否存在,即使它已设置为0.