首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当测试数组中的空值是否有长度时,Array.prototype.every返回true?

当测试数组中的空值是否有长度时,Array.prototype.every返回true?
EN

Stack Overflow用户
提问于 2020-07-09 15:18:10
回答 2查看 115关注 0票数 2

我正在尝试检查是否每个元素都是数组有真值。

但是,当测试一个数组有一些空值时,我会感到困惑。

代码语言:javascript
运行
复制
var arr = [];
arr[10] = 1;
arr; // [empty x 10, 1];
arr.every(item => Boolean(item)); // true ???
Boolean(arr[0]); // false ???!!!

这是我在chrome devtool控制台上运行上面的代码时得到的结果

EN

回答 2

Stack Overflow用户

发布于 2020-07-09 15:20:32

everysomemapfilter和其他大多数只访问存在的数组条目,而不访问像您这样的稀疏数组中的间隙。因此,结果仅基于检查实际存在的元素的值。

您可以看到,如果您逐步执行回调或向其添加日志记录:

代码语言:javascript
运行
复制
var arr = [];
arr[10] = 1;
arr.every((item, index) => {
    console.log(`Visited index ${index}, item = ${item}`);
    return Boolean(item);
});
// =>
// Visited index 10, item = 1


// Note that 0-9 are gaps:
console.log(`0 in arr? ${0 in arr}`);   // false
console.log(`9 in arr? ${9 in arr}`);   // false
console.log(`10 in arr? ${10 in arr}`); // true

如您所见,中的every回调只输出一行,因为它只被调用一次。

如果您希望该数组对元素0到9实际具有undefined,则可以使用fill;然后every将测试元素0并返回false,因为Boolean(undefined)false

代码语言:javascript
运行
复制
var index = 10;
var arr = Array(index + 1).fill();
arr[index] = 1;
console.log(arr.every(Boolean)); // false

票数 5
EN

Stack Overflow用户

发布于 2020-07-09 15:21:53

大多数数组操作不会对稀疏数组中未分配的索引进行操作。从MDN documentation

仅对已赋值的数组索引调用

callback。对于已删除或从未分配值的索引,不会调用它。

您只有一个索引被赋值为truthy,因此您对every()的调用将返回true。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62809439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档