我正在尝试检查是否每个元素都是数组有真值。
但是,当测试一个数组有一些空值时,我会感到困惑。
var arr = [];
arr[10] = 1;
arr; // [empty x 10, 1];
arr.every(item => Boolean(item)); // true ???
Boolean(arr[0]); // false ???!!!这是我在chrome devtool控制台上运行上面的代码时得到的结果

发布于 2020-07-09 15:20:32
every、some、map、filter和其他大多数只访问存在的数组条目,而不访问像您这样的稀疏数组中的间隙。因此,结果仅基于检查实际存在的元素的值。
您可以看到,如果您逐步执行回调或向其添加日志记录:
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
var index = 10;
var arr = Array(index + 1).fill();
arr[index] = 1;
console.log(arr.every(Boolean)); // false
发布于 2020-07-09 15:21:53
大多数数组操作不会对稀疏数组中未分配的索引进行操作。从MDN documentation
仅对已赋值的数组索引调用
callback。对于已删除或从未分配值的索引,不会调用它。
您只有一个索引被赋值为truthy,因此您对every()的调用将返回true。
https://stackoverflow.com/questions/62809439
复制相似问题