Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中的未定义项在使用'every'将其解析为布尔值后返回'true'`_Javascript_Arrays_Boolean_Undefined - Fatal编程技术网

Javascript 数组中的未定义项在使用'every'将其解析为布尔值后返回'true'`

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):'+

为了跟踪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感谢您的链接。也要感谢安德烈亚斯。