早在17年写过一篇JS数组的文章
文中提到
every,判断是否所有元素都符合,需要每个都为true才返回true,否则返回false
这个说法有误,当传入空数组时,返回的也是 true
js
[].every(_ => true)
//--> true
所以并不是说数组每个都为true时结果才为true,这点就很费解了 然后搜了ECMA-262规范的实现
js
Array.prototype.every = function(callbackfn, thisArg) {
const O = this;
const len = O.length;
if (typeof callbackfn !== "function") {
throw new TypeError("Callback isn't callable");
}
let k = 0;
while (k < len) {
const Pk = String(k);
const kPresent = O.hasOwnProperty(Pk);
if (kPresent) {
const kValue = O[Pk];
const testResult = Boolean(callbackfn.call(thisArg, kValue, k, O));
if (testResult === false) {
return false;
}
}
k = k + 1;
}
return true;
};
可以看出最后的 return true
,也就是说只有数组里遇到false
,才会返回false
,没有遇到false
则默认返回true
所以空数组时,压根没有进到while
循环,就直接返回默认true
了
再来看看 some
遇到空数组
js
[].some(_ => false)
//--> false
[].some(_ => true)
//--> false
空数组时,不管传入的判断函数返回值是什么,总是返回 false
查看some
的实现
js
Array.prototype.some = function(fun/*, thisArg*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.some called on null or undefined');
}
if (typeof fun !== 'function') {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t && fun.call(thisArg, t[i], i, t)) {
return true;
}
}
return false;
};
可以发现跟every
正好相反,默认返回值是false
,只有按数组中判断返回true
时,才会返回true