日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

小心這個陷阱: 為什么JS中的 Every()對空數組總返回 True

來源: 責編: 時間:2023-09-20 21:55:54 432觀看
導讀JavaScript 語言的核心部分足夠大,以至于我們很容易誤解其某些部分的工作方式。最近在重構一些使用 every() 方法的代碼時,發現實際上并不理解其背后的邏輯。在我的理解中,我認為回調函數必須被調用并返回true , every()

lzO28資訊網——每日最新資訊28at.com

JavaScript 語言的核心部分足夠大,以至于我們很容易誤解其某些部分的工作方式。最近在重構一些使用 every() 方法的代碼時,發現實際上并不理解其背后的邏輯。在我的理解中,我認為回調函數必須被調用并返回true , every() 才會返回 true ,但實際上并非如此。對于一個空數組, every() 無論回調函數是什么都會返回 true ,因為那個回調函數從未被調用過??紤]以下情況:lzO28資訊網——每日最新資訊28at.com

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

在這個例子的每個情況中,對 every() 的調用都會檢查數組中的每個項目是否為數字。前四次調用相當直接, every() 產生了預期的結果?,F在考慮以下這些例子:lzO28資訊網——每日最新資訊28at.com

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

這可能更令人驚訝:返回 true 或 false 的回調函數具有相同的結果。這只能發生的唯一原因是如果回調函數沒有被調用,而 every() 的默認值是 true 。但是,為什么在沒有值來運行回調函數時,空數組會返回 true 給 every() 呢?lzO28資訊網——每日最新資訊28at.com

要理解為什么,我們需要仔細看看規范是如何描述這個方法的。lzO28資訊網——每日最新資訊28at.com

實現 every()

ECMA-262 定義了一個 Array.prototype.every()  算法,大致可以翻譯成這段JavaScript代碼:lzO28資訊網——每日最新資訊28at.com

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() 假設結果是 true ,并且只有在回調函數對數組中的任何一項返回 false 時才返回 false 。如果數組中沒有任何項目,那么就沒有機會執行回調函數,因此,該方法無法返回 false 。lzO28資訊網——每日最新資訊28at.com

現在的問題是:為什么 every() 會表現出這樣的行為?lzO28資訊網——每日最新資訊28at.com

在數學和JavaScript中的“對所有”的量詞

MDN頁面 提供了為什么 every() 會對空數組返回 true 的答案:lzO28資訊網——每日最新資訊28at.com

every 的行為就像數學中的“全稱量詞”。特別是對于空數組,它返回真值。(空集中的所有元素都滿足任何給定條件,這是顯然的真理。)lzO28資訊網——每日最新資訊28at.com

空真(Vacuous truth)是一個數學概念,意味著如果給定的條件(稱為前件)不能被滿足(即給定的條件不為真),那么某件事就是真的。用JavaScript的術語來說,every() 對于一個空集合返回 true,因為沒有辦法調用回調函數。回調函數代表要測試的條件,如果由于數組中沒有值而無法執行它,那么 every() 必須返回 true。lzO28資訊網——每日最新資訊28at.com

“全稱量詞”("for all" quantifier)是數學中更大主題“全稱量化”(universal quantification)的一部分,它允許你對數據集進行推理??紤]到JavaScript數組在進行數學計算方面的重要性,尤其是在使用類型數組(typed arrays)的情況下,內置支持這樣的操作是合理的。而**every()**方法并不是唯一的例子。lzO28資訊網——每日最新資訊28at.com

在數學和JavaScript中的“存在量詞”

JavaScript的 some() 方法實現了存在量化(existential quantification)中的“存在量詞”(“存在”有時也被稱為“存在”或“對某些”)。這個“存在量詞”規定,對于任何空集合,結果都是假的。因此,some() 方法對空集合返回 false,并且也不會執行回調函數。以下是一些相關的示例:lzO28資訊網——每日最新資訊28at.com

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并不是唯一實現了集合或可迭代對象的量化方法的編程語言:lzO28資訊網——每日最新資訊28at.com

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

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

無論你是否認為 every() 方法的行為違反直覺都是可以討論的。然而,無論你的觀點如何,你都需要了解 every() 的“全稱量詞”(for all)特性以避免錯誤。簡而言之,如果你使用 every() 方法或可能為空的數組,你應該事先進行明確的檢查。例如,如果你有一個依賴于數字數組的操作,并且在數組為空時會失敗,那么在使用 every() 之前,你應該檢查數組是否為空。lzO28資訊網——每日最新資訊28at.com

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

再次強調,只有當你有一個數組在為空時不應該被用于操作時,這才重要;否則,你可以避免這個額外的檢查。lzO28資訊網——每日最新資訊28at.com

結論

當我第一次看到 every() 在空數組上的行為時,我感到很驚訝,但一旦你理解了這個操作的更大背景和這個功能在各種語言中的廣泛應用,就會覺得它是有道理的。如果你也對這個行為感到困惑,那么我建議你改變閱讀 every() 調用的方式。不要把 every() 理解為“這個數組中的每一項是否都符合這個條件?”而應該理解為“這個數組中是否有任何一項不符合這個條件?”這種思維方式的轉變可以幫助你避免在未來的JavaScript代碼中出現錯誤。lzO28資訊網——每日最新資訊28at.com

lzO28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-10557-0.html小心這個陷阱: 為什么JS中的 Every()對空數組總返回 True

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring強大的數據格式化處理功能,你必須得知道

下一篇: Github的一個奇技淫巧,你學會了嗎?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲电影第1页| 欧美日韩1080p| 亚洲一区二区成人| 午夜精品久久久久久久男人的天堂| 欧美一区二区视频在线观看| 欧美一区二视频| 麻豆久久精品| 国产精品福利片| 精品成人久久| 国产精品99久久99久久久二8| 午夜在线精品偷拍| 欧美成人午夜免费视在线看片 | 欧美综合国产| 欧美成人一区二区三区片免费| 欧美午夜视频网站| 精品不卡一区二区三区| 99在线观看免费视频精品观看| 欧美在线影院在线视频| 欧美老女人xx| 国产一区再线| 一区二区三区四区国产精品| 久久九九热re6这里有精品| 欧美日韩国产电影| 激情综合激情| 亚洲尤物精选| 欧美激情一区二区三区全黄| 国产农村妇女精品| 日韩视频免费在线观看| 久久精品人人做人人爽| 欧美日韩视频在线一区二区 | 国产尤物精品| 一区二区三区导航| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品久久久久久久久动漫| 亚洲韩日在线| 久久精品视频在线看| 国产精品夫妻自拍| 99re66热这里只有精品3直播| 国产性色一区二区| 一本久道久久久| 欧美国产三区| 伊人久久亚洲影院| 欧美在线高清视频| 欧美午夜精品伦理| 日韩视频在线一区| 免费一级欧美片在线播放| 国产在线乱码一区二区三区| 亚洲欧美成人一区二区三区| 欧美日韩精品免费观看| 亚洲区中文字幕| 久久综合中文色婷婷| 国模大胆一区二区三区| 亚洲欧美日韩在线不卡| 欧美日韩在线视频观看| 99re66热这里只有精品4| 欧美国产日韩视频| 亚洲高清123| 老牛嫩草一区二区三区日本| 国产亚洲一区二区精品| 亚洲欧美一区二区精品久久久| 欧美三级乱码| 在线亚洲欧美专区二区| 欧美午夜一区| 中国成人亚色综合网站| 欧美日韩国产天堂| 一本色道88久久加勒比精品| 欧美日本高清| 99在线精品视频| 欧美日韩免费一区| 中国成人黄色视屏| 欧美色另类天堂2015| 99精品视频免费全部在线| 欧美片网站免费| 亚洲伦理自拍| 欧美午夜一区二区三区免费大片 | 欧美一区在线视频| 国产午夜精品全部视频播放 | 日韩午夜免费视频| 欧美日本一区| 中国成人黄色视屏| 国产精品福利影院| 午夜精品久久久久久久久久久| 国产精品毛片va一区二区三区| 亚洲综合三区| 国产日韩欧美亚洲一区| 欧美在线精品免播放器视频| 国产一区二区三区精品欧美日韩一区二区三区 | 在线播放国产一区中文字幕剧情欧美| 久久久噜噜噜久久狠狠50岁| 黄色亚洲在线| 欧美不卡高清| 一区二区日韩欧美| 国产精品剧情在线亚洲| 欧美一级欧美一级在线播放| 国产亚洲一级高清| 老司机67194精品线观看| 亚洲国产清纯| 欧美日韩在线精品| 亚洲免费在线电影| 国产主播一区二区三区四区| 快播亚洲色图| 亚洲美女区一区| 国产精品青草综合久久久久99| 欧美在线播放一区二区| 在线电影一区| 欧美日韩视频| 欧美一区二区国产| 在线观看免费视频综合| 欧美日韩免费一区| 小处雏高清一区二区三区| 一区二区视频欧美| 欧美欧美天天天天操| 午夜精品一区二区在线观看| 狠狠色狠狠色综合日日五| 欧美精品91| 亚洲欧美电影院| 激情六月综合| 欧美天天综合网| 久久久999精品免费| 亚洲日韩第九十九页| 国产精品乱码人人做人人爱| 久久欧美肥婆一二区| 99精品黄色片免费大全| 国产午夜精品全部视频播放| 欧美大片在线观看| 国产欧美日韩综合精品二区| 久久亚裔精品欧美| 亚洲视频碰碰| 精品999久久久| 欧美日韩午夜精品| 久久精品2019中文字幕| 99re66热这里只有精品4| 国产亚洲欧美激情| 欧美日韩国产一区二区三区地区 | 一区二区av在线| 国产亚洲欧美日韩在线一区| 欧美激情久久久| 欧美在线一二三四区| 日韩亚洲精品电影| 狠狠色狠狠色综合日日tαg | 国产原创一区二区| 欧美日韩一区二区视频在线| 久久高清福利视频| 一本久久a久久免费精品不卡| 一区二区三区在线不卡| 国产精品嫩草99a| 欧美激情第六页| 久久精品成人| 亚洲在线免费视频| 亚洲国产精品女人久久久| 国产欧美一区二区三区在线老狼 | 国产精品欧美日韩一区二区| 欧美粗暴jizz性欧美20| 久久激情综合网| 亚洲中字黄色| 日韩午夜免费视频| 在线成人av| 国产视频一区免费看| 国产精品高清在线观看| 欧美精品在线免费| 久久一区欧美| 欧美专区亚洲专区| 亚洲一区二区在| 99国产精品久久久久久久| 亚洲国产91| 狠狠色狠狠色综合日日tαg| 国产毛片一区二区| 国产精品v欧美精品v日本精品动漫| 欧美成人激情在线| 久久蜜臀精品av| 欧美在线精品一区| 亚洲欧美日韩爽爽影院| 亚洲一区二区三区高清| 99re视频这里只有精品| 亚洲国产美女精品久久久久∴| 含羞草久久爱69一区| 国产日韩欧美a| 国产精品免费观看视频| 欧美视频一区二区三区在线观看| 欧美激情成人在线| 欧美91精品| 免费一级欧美片在线观看| 久久影视三级福利片| 久久久精品动漫| 久久精品天堂| 久久久xxx| 久久久久国产一区二区| 久久国产免费看| 久久精品av麻豆的观看方式| 欧美一区不卡| 欧美中文字幕不卡| 香蕉久久久久久久av网站| 亚洲综合视频网| 亚洲欧美激情视频| 亚洲欧美美女| 午夜精品影院在线观看| 欧美一区二区三区在线看| 欧美一区二区三区视频| 久久av红桃一区二区小说| 久久精品午夜| 久久婷婷久久一区二区三区| 久久免费视频网| 女生裸体视频一区二区三区| 欧美福利电影网|