最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析js中的every()對空數(shù)組總返回true

 更新時(shí)間:2023年09月19日 09:27:55   作者:王大冶  
JavaScript?語言的核心部分足夠大,以至于我們很容易誤解其某些部分的工作方式,本文就來和大家一起討論下為什么JS中的?every()對空數(shù)組總返回?true,需要的可以參考下

JavaScript 語言的核心部分足夠大,以至于我們很容易誤解其某些部分的工作方式。最近在重構(gòu)一些使用 every() 方法的代碼時(shí),發(fā)現(xiàn)實(shí)際上并不理解其背后的邏輯。在我的理解中,我認(rèn)為回調(diào)函數(shù)必須被調(diào)用并返回trueevery() 才會(huì)返回 true ,但實(shí)際上并非如此。對于一個(gè)空數(shù)組, every() 無論回調(diào)函數(shù)是什么都會(huì)返回 true ,因?yàn)槟莻€(gè)回調(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

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

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

這可能更令人驚訝:返回 truefalse 的回調(diào)函數(shù)具有相同的結(jié)果。這只能發(fā)生的唯一原因是如果回調(diào)函數(shù)沒有被調(diào)用,而 every() 的默認(rèn)值是 true 。但是,為什么在沒有值來運(yùn)行回調(diào)函數(shù)時(shí),空數(shù)組會(huì)返回 trueevery() 呢?

要理解為什么,我們需要仔細(xì)看看規(guī)范是如何描述這個(gè)方法的。

實(shí)現(xiàn) every()

ECMA-262 定義了一個(gè) 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 ,并且只有在回調(diào)函數(shù)對數(shù)組中的任何一項(xiàng)返回 false 時(shí)才返回 false 。如果數(shù)組中沒有任何項(xiàng)目,那么就沒有機(jī)會(huì)執(zhí)行回調(diào)函數(shù),因此,該方法無法返回 false

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

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

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

every 的行為就像數(shù)學(xué)中的“全稱量詞”。特別是對于空數(shù)組,它返回真值。(空集中的所有元素都滿足任何給定條件,這是顯然的真理。)

空真(Vacuous truth)是一個(gè)數(shù)學(xué)概念,意味著如果給定的條件(稱為前件)不能被滿足(即給定的條件不為真),那么某件事就是真的。用JavaScript的術(shù)語來說,every() 對于一個(gè)空集合返回 true,因?yàn)闆]有辦法調(diào)用回調(diào)函數(shù)?;卣{(diào)函數(shù)代表要測試的條件,如果由于數(shù)組中沒有值而無法執(zhí)行它,那么 every() 必須返回 true

“全稱量詞”("for all" quantifier)是數(shù)學(xué)中更大主題“全稱量化”(universal quantification)的一部分,它允許你對數(shù)據(jù)集進(jìn)行推理??紤]到JavaScript數(shù)組在進(jìn)行數(shù)學(xué)計(jì)算方面的重要性,尤其是在使用類型數(shù)組(typed arrays)的情況下,內(nèi)置支持這樣的操作是合理的。而**every()**方法并不是唯一的例子。

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

JavaScript的 some() 方法實(shí)現(xiàn)了存在量化(existential quantification)中的“存在量詞”(“存在”有時(shí)也被稱為“存在”或“對某些”)。這個(gè)“存在量詞”規(guī)定,對于任何空集合,結(jié)果都是假的。因此,some() 方法對空集合返回 false,并且也不會(huì)執(zhí)行回調(diào)函數(shù)。以下是一些相關(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并不是唯一實(shí)現(xiàn)了集合或可迭代對象的量化方法的編程語言:

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

“全稱量詞”(for all)的 every() 方法的含義與影響

無論你是否認(rèn)為 every() 方法的行為違反直覺都是可以討論的。然而,無論你的觀點(diǎn)如何,你都需要了解 every() 的“全稱量詞”(for all)特性以避免錯(cuò)誤。簡而言之,如果你使用 every() 方法或可能為空的數(shù)組,你應(yīng)該事先進(jìn)行明確的檢查。例如,如果你有一個(gè)依賴于數(shù)字?jǐn)?shù)組的操作,并且在數(shù)組為空時(shí)會(huì)失敗,那么在使用 every() 之前,你應(yīng)該檢查數(shù)組是否為空。

function doSomethingWithNumbers(numbers) {
    // first check the length
    if (numbers.length === 0) {
        throw new TypeError("Numbers array is empty; this method requires at least one number.");
    }
    // now check with every()
    if (numbers.every(isNumber)) {
        operationRequiringNonEmptyArray(numbers);
    }
}

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

結(jié)論

當(dāng)我第一次看到 every() 在空數(shù)組上的行為時(shí),我感到很驚訝,但一旦你理解了這個(gè)操作的更大背景和這個(gè)功能在各種語言中的廣泛應(yīng)用,就會(huì)覺得它是有道理的。如果你也對這個(gè)行為感到困惑,那么我建議你改變閱讀 every() 調(diào)用的方式。不要把 every() 理解為“這個(gè)數(shù)組中的每一項(xiàng)是否都符合這個(gè)條件?”而應(yīng)該理解為“這個(gè)數(shù)組中是否有任何一項(xiàng)不符合這個(gè)條件?”這種思維方式的轉(zhuǎn)變可以幫助你避免在未來的JavaScript代碼中出現(xiàn)錯(cuò)誤。

以上就是淺析js中的every()對空數(shù)組總返回true的詳細(xì)內(nèi)容,更多關(guān)于js every()的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • javascript基本常用排序算法解析

    javascript基本常用排序算法解析

    這篇文章主要為大家詳細(xì)介紹了javascript基本常用排序算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Electron實(shí)現(xiàn)文件復(fù)制到剪切板的方案

    Electron實(shí)現(xiàn)文件復(fù)制到剪切板的方案

    這篇文章主要介紹了Electron實(shí)現(xiàn)文件復(fù)制到剪切板的解決方案,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • javascript使用smipleChart實(shí)現(xiàn)簡單圖表

    javascript使用smipleChart實(shí)現(xiàn)簡單圖表

    這篇文章主要介紹了javascript使用smipleChart實(shí)現(xiàn)簡單圖表的方法及示例分享,需要的朋友可以參考下
    2015-01-01
  • Es6 Generator函數(shù)詳細(xì)解析

    Es6 Generator函數(shù)詳細(xì)解析

    Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同。這篇文章給大家介紹Es6 Generator函數(shù)的相關(guān)知識,感興趣的朋友一起看看吧
    2018-02-02
  • JS中innerHTML和pasteHTML的區(qū)別實(shí)例分析

    JS中innerHTML和pasteHTML的區(qū)別實(shí)例分析

    這篇文章主要介紹了JS中innerHTML和pasteHTML的區(qū)別,結(jié)合實(shí)例形式較為詳細(xì)的分析了innerHTML和pasteHTML的具體功能與使用區(qū)別,需要的朋友可以參考下
    2016-06-06
  • 簡述凍結(jié)JS對象方法技術(shù)

    簡述凍結(jié)JS對象方法技術(shù)

    本文主要介紹了凍結(jié)JS對象方法技術(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 學(xué)習(xí)JavaScript設(shè)計(jì)模式之策略模式

    學(xué)習(xí)JavaScript設(shè)計(jì)模式之策略模式

    這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的策略模式,對JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下
    2016-01-01
  • uniapp小程序底部tabbar圖標(biāo)大小設(shè)置辦法

    uniapp小程序底部tabbar圖標(biāo)大小設(shè)置辦法

    這篇文章主要給大家介紹了關(guān)于uniapp小程序底部tabbar圖標(biāo)大小設(shè)置辦法的相關(guān)資料,在使用uniapp進(jìn)行開發(fā)時(shí),tabbar是我們使用的很頻繁的一個(gè)組件,但是在特定的平臺會(huì)有一些使用上的限制,需要的朋友可以參考下
    2023-08-08
  • js H5 canvas投籃小游戲

    js H5 canvas投籃小游戲

    這篇文章主要為大家詳細(xì)介紹了JavaScript結(jié)合H5 canvas實(shí)現(xiàn)投籃小游戲的具體代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • echarts學(xué)習(xí)之如何給餅圖中間添加文字

    echarts學(xué)習(xí)之如何給餅圖中間添加文字

    這篇文章主要介紹了echarts學(xué)習(xí)之如何給餅圖中間添加文字問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

和田市| 万年县| 东宁县| 扎鲁特旗| 禄劝| 宝鸡市| 澳门| 广州市| 盘锦市| 阜南县| 许昌市| 高邑县| 云安县| 连云港市| 财经| 扬中市| 望都县| 惠来县| 新闻| 于都县| 承德县| 新巴尔虎右旗| 柳河县| 集贤县| 新巴尔虎左旗| 佳木斯市| 张家港市| 句容市| 奇台县| 井陉县| 昌宁县| 灵武市| 渑池县| 耿马| 土默特右旗| 惠安县| 鄂伦春自治旗| 微山县| 阿坝县| 通许县| 柞水县|