模擬面試、簡歷指導、入職指導、計畫指導、答疑解惑 可私信找我~已幫助100+名同學完成改造!
前言
大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~
背景
今天在開發計畫的時候,我的組員造成了一個BUG,原因是用了一個挺常用的陣列方法: ervey ,相信大家都見過,或者都用過,它經常跟 some 成雙出現,我們理解這兩個方法是:
every: 判斷陣列每一項是否符合條件
some: 判斷陣列是否至少有一個符合條件
可以透過一個小例子來認識,我準備了一個使用者陣列,我分別想做兩件事:
1、判斷是否所有人都成年了
2、判斷是否有人大於20歲
有坑?
再來計畫中搞的程式碼吧,邏輯也跟上述例子差不多,就是透過請求獲取一組使用者,並判斷這組使用者是否全都已成年
但是這個程式碼卻出現了BUG,什麽呢?就是當 users 是空陣列的時候,every 會返回 true!!!不信我們可以看看
我當時看到了,也感覺挺不解的,按理說, every: 判斷陣列每一項是否符合條件,那如果陣列為空的話,那就是沒有一個符合條件的,不應是返回 false 嗎,不過先不管,先改BUG 先,後面再去想了,加個長度判斷,先解決BUG先
空陣列,every 返回 true?
我們先來看一下
ECMA-262
定義的
Array.prototype.every
可以看到,every 是判斷每一次執行迴圈函式是否有 false 返回,有的話直接返回 false,如果一個 false 都沒有,那就返回 true
關於空陣列呼叫 every() 返回 true 的原因,MDN 網頁 提供了答案:
every 的作用就像數學中的「for all」量詞。特別是,對於空陣列,它返回 true。(地球人都知道,空集的所有元素都滿足任何給定的條件。)
空真(Vacuous truth) 是一個數學概念,它意味著若給定條件(稱為前提)不能滿足(比如給定條件不為真),則某事為真。用 JS 的術語來說,every() 返回 true,是因為它無法呼叫回呼。回呼表示要測試的條件,如果因為陣列中沒有值而無法執行,那麽 every() 必須返回 true。
全稱量詞 是數學中一個更大主題的一部份,它允許您對數據集進行推理。考慮到 JS 陣列對於執行數學計算的重要性,尤其是型別化陣列,為此類操作提供內建支持是有意義的。every() 不是孤例。
改變思維
以前我人為的: every 判斷陣列每一項是否符合條件
但是我覺得我不應該那麽理解,我應該理解為: every 判斷陣列是否至少有一個不符合條件 ,這麽去理解的話,自然就能知道為什麽空陣列是返回 true了,因為就沒有不符合條件的,當然就是返回 true 啦~
結語
我是林三心
一個待過 小型toG型外包公司、大型外包公司、小公司、潛力型創業公司、大公司 的作死型前端選手;
一個偏前端的全幹工程師;
一個不正經的金塊作者;
逗比的B站up主;
不帥的小紅書博主;
喜歡打鐵的籃球菜鳥;
喜歡歷史的乏味少年;
喜歡rap的五音不全弱雞如果你想一起學習前端,一起摸魚,一起研究簡歷最佳化,一起研究面試進步,一起交流歷史音樂籃球rap,可以來俺的摸魚學習群哈哈,點這個,有7000多名前端小夥伴在等著一起學習哦 -->
廣州的兄弟可以約飯哦,或者約球~我負責打鐵,你負責進球,謝謝~