用數(shù)組 Every 方法好多年,發(fā)現(xiàn)自己的理解是錯(cuò)的
大家好,我是林三心,用最通俗易懂的話講最難的知識(shí)點(diǎn)是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心~
背景
今天在開(kāi)發(fā)項(xiàng)目的時(shí)候,我的組員造成了一個(gè)BUG,原因是用了一個(gè)挺常用的數(shù)組方法:ervey,相信大家都見(jiàn)過(guò),或者都用過(guò),它經(jīng)常跟 some 成雙出現(xiàn),我們理解這兩個(gè)方法是:
- every: 判斷數(shù)組每一項(xiàng)是否符合條件
- some: 判斷數(shù)組是否至少有一個(gè)符合條件
可以通過(guò)一個(gè)小例子來(lái)認(rèn)識(shí),我準(zhǔn)備了一個(gè)用戶(hù)數(shù)組,我分別想做兩件事:
1、判斷是否所有人都成年了
2、判斷是否有人大于20歲
圖片
有坑?
再來(lái)項(xiàng)目中搞的代碼吧,邏輯也跟上述例子差不多,就是通過(guò)請(qǐng)求獲取一組用戶(hù),并判斷這組用戶(hù)是否全都已成年
圖片
但是這個(gè)代碼卻出現(xiàn)了BUG,什么呢?就是當(dāng) users 是空數(shù)組的時(shí)候,every 會(huì)返回 true!!!不信我們可以看看
圖片
我當(dāng)時(shí)看到了,也感覺(jué)挺不解的,按理說(shuō),every: 判斷數(shù)組每一項(xiàng)是否符合條件,那如果數(shù)組為空的話,那就是沒(méi)有一個(gè)符合條件的,不應(yīng)是返回 false 嗎,不過(guò)先不管,先改BUG 先,后面再去想了,加個(gè)長(zhǎng)度判斷,先解決BUG先
圖片
空數(shù)組,every 返回 true?
我們先來(lái)看一下ECMA-262定義的Array.prototype.every
圖片
可以看到,every 是判斷每一次執(zhí)行循環(huán)函數(shù)是否有 false 返回,有的話直接返回 false,如果一個(gè) false 都沒(méi)有,那就返回 true
關(guān)于空數(shù)組調(diào)用 every() 返回 true 的原因,MDN 網(wǎng)頁(yè) 提供了答案:
every 的作用就像數(shù)學(xué)中的“for all”量詞。特別是,對(duì)于空數(shù)組,它返回 true。(地球人都知道,空集的所有元素都滿足任何給定的條件。)
空真(Vacuous truth) 是一個(gè)數(shù)學(xué)概念,它意味著若給定條件(稱(chēng)為前提)不能滿足(比如給定條件不為真),則某事為真。用 JS 的術(shù)語(yǔ)來(lái)說(shuō),every() 返回 true,是因?yàn)樗鼰o(wú)法調(diào)用回調(diào)。回調(diào)表示要測(cè)試的條件,如果因?yàn)閿?shù)組中沒(méi)有值而無(wú)法執(zhí)行,那么 every() 必須返回 true。
全稱(chēng)量詞 是數(shù)學(xué)中一個(gè)更大主題的一部分,它允許您對(duì)數(shù)據(jù)集進(jìn)行推理。考慮到 JS 數(shù)組對(duì)于執(zhí)行數(shù)學(xué)計(jì)算的重要性,尤其是類(lèi)型化數(shù)組,為此類(lèi)操作提供內(nèi)置支持是有意義的。every() 不是孤例。
改變思維
以前我人為的:every 判斷數(shù)組每一項(xiàng)是否符合條件
但是我覺(jué)得我不應(yīng)該那么理解,我應(yīng)該理解為:every 判斷數(shù)組是否至少有一個(gè)不符合條件,這么去理解的話,自然就能知道為什么空數(shù)組是返回 true了,因?yàn)榫蜎](méi)有不符合條件的,當(dāng)然就是返回 true 啦~


























