Skip to content

早在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

相关资料

上次更新于: