亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript空數(shù)組的every()方法實踐

 更新時間:2024年03月11日 09:03:04   作者:Apifox.  
every()方法用于檢測數(shù)組中的所有元素是否都滿足指定條件, 本文主要介紹了JavaScript空數(shù)組的every()方法實踐,具有一定的參考價值,感興趣的可以了解一下

JavaScript 語言的核心足夠大,以至于很容易誤解其某些部分的工作方式。我最近在重構(gòu)一些使用 every() 方法的代碼時發(fā)現(xiàn),我實際上并沒有完全理解其背后的邏輯。在我的腦海中,我假設(shè)回調(diào)函數(shù)必須被調(diào)用并返回 trueevery() 才會返回 true,但實際情況并非如此。對于一個空數(shù)組,every() 無論回調(diào)函數(shù)是什么都會返回 true,因為那個回調(diào)函數(shù)從未被調(diào)用??紤]以下情況:

function isNumber(value) {
    return typeof value === "number";
}

[1].every(isNumber);            // true
["1"].every(isNumber);          // false
[1, 2, 3].every(isNumber);      // true
[1, "2", 3].every(isNumber);    // false
[].every(isNumber);             // true

在這個例子的每種情況下,調(diào)用 every() 都是為了檢查數(shù)組中的每一項是否為數(shù)字。前四個調(diào)用相當(dāng)直接,every() 產(chǎn)生了預(yù)期的結(jié)果?,F(xiàn)在考慮這些例子:

[].every(() => true);           // true
[].every(() => false);          // true

這可能更令人驚訝:無論是返回 true 還是 false 的回調(diào),結(jié)果都是一樣的。唯一的原因是如果回調(diào)沒有被調(diào)用,every() 的默認(rèn)值是 true。但是,為什么一個空數(shù)組會對 every() 返回 true,當(dāng)沒有值去執(zhí)行回調(diào)函數(shù)時呢?

要理解原因,重要的是要看看規(guī)范是如何描述這個方法的。

實現(xiàn) every()

ECMA-262 定義了一個 Array.prototype.every() 算法,大致可以翻譯成以下的 JavaScript 代碼:

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;
};

從代碼中可以看到,every() 假設(shè)結(jié)果是 true,并且只有當(dāng)回調(diào)函數(shù)對數(shù)組中的任何一個條目返回 false 時,才會返回 false。如果數(shù)組中沒有條目,則沒有執(zhí)行回調(diào)函數(shù)的機會,因此,該方法無法返回 false

現(xiàn)在的問題是:every() 為什么會這樣表現(xiàn)呢?

數(shù)學(xué)和 JavaScript 中的“全稱量詞”

MDN 頁面提供了為什么 every() 對一個空數(shù)組返回 true 的答案:

every 表現(xiàn)得像數(shù)學(xué)中的“全稱量詞”。特別是對于一個空數(shù)組,它返回 true。(空集合中的所有元素默認(rèn)滿足任何給定條件是一種空洞真理。)

空洞真理 是指如果給定條件(稱為前提)不能滿足(即,給定條件不是真的),那么某事是真的。把它轉(zhuǎn)回 JavaScript 方面,every() 對一個空集返回 true 是因為沒有辦法調(diào)用回調(diào)。回調(diào)代表要測試的條件,如果因為數(shù)組中沒有值而無法執(zhí)行它,則 every() 必須返回 true。

“全稱量詞”是數(shù)學(xué)中一個更大主題的一部分,稱為普遍量化,它允許你對數(shù)據(jù)集合進行推理。鑒于 JavaScript 數(shù)組在執(zhí)行數(shù)學(xué)計算中的重要性,尤其是與類型化數(shù)組一起使用,自然會支持這種操作。而且 every() 不是唯一的例子。

數(shù)學(xué)和 JavaScript 中的“存在量詞”

JavaScript 的 some() 方法實現(xiàn)了存在量化(“存在”有時也稱為“存在”或“對于某些”)中的“存在”量詞。"存在" 量詞聲明,對于任何空集合,結(jié)果是假。因此,some() 方法對一個空集返回 false,并且它也不執(zhí)行回調(diào)。這里有一些例子(雙關(guān)語):

function isNumber(value) {
    return typeof value === "number";
}

[1].some(isNumber);            // true
["1"].some(isNumber);          // false
[1, 2, 3].some(isNumber);      // true
[1, "2", 3].some(isNumber);    // true
[].some(isNumber);             // false
[].some(() => true);           // false
[].some(() => false);          // false

其他語言中的量化

JavaScript 不是唯一一個為集合或迭代器實現(xiàn)了量化方法的編程語言:

  • Python: all() 函數(shù)實現(xiàn)了“全稱” ,而 any() 函數(shù)實現(xiàn)了“存在”。
  • Rust: Iterator::all() 方法實現(xiàn)了“全稱”,而 any() 方法實現(xiàn)了“存在”。

因此,JavaScript 憑借 every() 和 some() 與眾不同。

“全稱” every() 的含義

不管你是否認(rèn)為 every() 的行為違反直覺,這都是值得討論的。然而,不管你的觀點如何,你都需要意識到 every() 的“全稱”本質(zhì),以避免錯誤。簡而言之,如果你使用 every() 或可能為空的數(shù)組時,你應(yīng)該事先進行明確的檢查。例如,如果你有一個依賴數(shù)字?jǐn)?shù)組的操作,而空數(shù)組會導(dǎo)致操作失敗,那么你應(yīng)該在使用 every() 之前檢查數(shù)組是否為空:

function doSomethingWithNumbers(numbers) {

    // 首先檢查長度
    if (numbers.length === 0) {
        throw new TypeError("Numbers array is empty; this method requires at least one number.");
    }

    // 現(xiàn)在用 every() 檢查
    if (numbers.every(isNumber)) {
        operationRequiringNonEmptyArray(numbers);
    }

}

再次強調(diào),只有當(dāng)你有一個不應(yīng)該在空的時候用于操作的數(shù)組時,這個額外的檢查才是重要的;否則,你可以避免這個額外的檢查。

結(jié)論

雖然我對 every() 對一個空數(shù)組的行為感到驚訝,但一旦你理解了這個操作的更廣泛上下文以及這個功能在不同語言中的普及,這就講得通了。如果你對這個行為也感到困惑,那么我建議你在遇到 every() 調(diào)用時改變你的閱讀方式。不要把 every() 看作是“這個數(shù)組的每一項是否滿足這個條件?”而是看作是,“數(shù)組中是否有任何一項不滿足這個條件?”這種思維的轉(zhuǎn)變可以幫助你避免未來在你的 JavaScript 代碼中出現(xiàn)錯誤。

原文作者:Nicholas C. Zakas (https://humanwhocodes.com/blog/2023/09/javascript-wtf-why-does-every-return-true-for-empty-array/)

到此這篇關(guān)于JavaScript空數(shù)組的every()方法實踐的文章就介紹到這了,更多相關(guān)JavaScript空數(shù)組every()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論