Javascript 数组中的未定义项在使用'every'将其解析为布尔值后返回'true'`
为了跟踪3个布尔值,我决定使用一个简单的数组:Javascript 数组中的未定义项在使用'every'将其解析为布尔值后返回'true'`,javascript,arrays,boolean,undefined,Javascript,Arrays,Boolean,Undefined,为了跟踪3个布尔值,我决定使用一个简单的数组: var processingDone = Array(3); 然后,我将布尔值设置为适当的索引(伪代码): 我想一个简单的方法来检查里面所有的布尔值是否都是真的,就是使用每一个,如下所示: if(processingDone.every(Boolean)){ // Do stuff } 现在,由于某种原因,如果不是所有布尔值都被设置,而是所有被设置的布尔值都是true,那么every返回true: alert('Array(3):'+
var processingDone = Array(3);
然后,我将布尔值设置为适当的索引(伪代码):
我想一个简单的方法来检查里面所有的布尔值是否都是真的,就是使用每一个,如下所示:
if(processingDone.every(Boolean)){
// Do stuff
}
现在,由于某种原因,如果不是所有布尔值都被设置,而是所有被设置的布尔值都是true
,那么every
返回true
:
alert('Array(3):'+Array(3)。every(Boolean)+'\n'+//true
“[,]:”+[,”.every(布尔值)+'\n'+//true
“[true,true]:”+[true,true]。每一个(布尔值)+'\n'+//true
'[,false,]:'+[,false,].每一个(布尔值)+'\n'+//false
'All true:'+[true,true,true].every(布尔)+'\n'+//true
'All false:'+[false,false,false].every(布尔值));//false
forEach为每个存在的元素执行一次提供的回调
在数组中按升序排列。对于索引调用的是而不是
已被删除或删除。但是,它是针对以下元素执行的:
存在并且的值未定义
我强烈怀疑每一个都是这样循环的,尽管我正在搜索规范
因此,当[true,true]
每调用一次时,只有[true,true]
(假设)被传递,因为第二个元素被忽略。然而,请考虑下面的
[true,undefined,true].every(Boolean) // false
上面返回的false
为它实际上包含未定义的值,而不仅仅是未定义的结果,这是我们尝试访问具有未设置索引的数组元素时得到的结果
在我们的例子中,[true,,true]
在0和2索引中有值,但在1中没有值
总结:
Boolean(或指定的回调)只对存在的实际值调用,而不对导致错误值(未定义
)的值调用,因为它们首先不存在
forEach上的MDN
forEach为每个存在的元素执行一次提供的回调
在数组中按升序排列。对于索引调用的是而不是
已被删除或删除。但是,它是针对以下元素执行的:
存在并且的值未定义
我强烈怀疑每一个都是这样循环的,尽管我正在搜索规范
因此,当[true,true]
每调用一次时,只有[true,true]
(假设)被传递,因为第二个元素被忽略。然而,请考虑下面的
[true,undefined,true].every(Boolean) // false
上面返回的false
为它实际上包含未定义的值,而不仅仅是未定义的结果,这是我们尝试访问具有未设置索引的数组元素时得到的结果
在我们的例子中,[true,,true]
在0和2索引中有值,但在1中没有值
总结:
Boolean(或指定的回调)只对存在的实际值调用,而不对导致错误值(未定义
)的值调用,因为它们首先不存在
这就是array.each的工作原理:
- 对每个已赋值的数组元素调用回调函数,但对已删除或从未赋值的索引(例如数组(3))不会调用回调函数
- 如果回调返回false值,它将返回false。因为您没有赋值,所以永远不会调用Boolean
试试看
[false,false,false].every(function(value) {
console.info(arguments);
return true;
});
vs(无控制台输出)
这就是array.each的工作原理:
- 对每个已赋值的数组元素调用回调函数,但对已删除或从未赋值的索引(例如数组(3))不会调用回调函数
- 如果回调返回false值,它将返回false。因为您没有赋值,所以永远不会调用Boolean
试试看
[false,false,false].every(function(value) {
console.info(arguments);
return true;
});
vs(无控制台输出)
如果索引未初始化(或删除),则它是未定义的
,因此被.every()
忽略。如果索引未初始化(或删除),则为步骤7.b/c,它是未定义的,因此被.every()
忽略。这是第7.b/c步,从这里开始,这种情况在这里肯定是有意义的似乎证实了这一点。@Cerbrus感谢您的链接。也要感谢安德烈亚斯。在这里,这种情况当然是有道理的似乎证实了这一点。@Cerbrus感谢您的链接。也要感谢安德烈亚斯。