日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

第九十六期:JavaScript 中的 4 个相等比较算法的介绍

發布時間:2023/12/10 javascript 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第九十六期:JavaScript 中的 4 个相等比较算法的介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JavaScript 運算中,一共包含 4 個相等比較算法:抽象相等比較;嚴格相等比較;SameValueZero;SameValue。

作者:zhangbao90s

JavaScript 運算中,一共包含 4 個相等比較算法:

  • 抽象相等比較
  • 嚴格相等比較
  • SameValueZero
  • SameValue

可以這么說,只要你做過相等比較,你就在使用四個算法中的一個。因為這些算法部署在了涉及到相等比較的操作符或方法中。

參見下表:

怎樣區分這些算法的不同呢,可以從兩方面切入:

  • 是否會發生類型轉換
  • 對 NaN、-0、+0(即 0) 這些值是否存在特殊處理
  • 下面給出一個總結:

    就是說,抽象相等比較算法會發生類型轉換,SameValue 算法不會特殊對待 NaN、-0、+0 這些值。

    類型轉換如何進行的?

    上面討論的四種算法中,只有“抽象相等比較算法”會發生類型轉換。發生類型轉換的前提是:比較的兩個值類型不同,而且轉換結果是數值。

    舉個例子:

    ?
  • 1?==?1?//?true(未發生類型轉換)?
  • '1'?==?1?//?true(發生了類型轉換)?
  • 第一個比較為 true,好理解;第二個就不一樣了,會發生類型轉換——將非數字值轉為數字:'1' 跟 1 比較,兩者類型不同,'1' 是字符串,因此會先轉為數字——也就是 1(Number('1')),結果變為兩個 1 在一起比較,結果就是 true 了。

    “抽象相等比較算法”還有一個比較怪癖的地方,在于規范中定義 null == undefined 返回結果為 true。按理說應該發生類型轉換,再進行比較的,比較結果應為 false(null 轉為 0,undefined 轉為 NaN,兩者不等)。

    規范中對抽象相等比較算法搞了一個“小怪癖”:定義 null 和 undefined 的比較結果為 true

    我猜想,這一定義可能是為了保證向前兼(tián)容(kēng),因此,我們記住即可。除此之外的其他情況,都按照類型轉換后的比較結果為準。

    NaN、-0 和 +0 是如何被特殊處理的?

    ES2015 標準出版之前,是沒有 SameValueZero 和 SameValue 這兩個算法的。也就是說只有抽象相等比較和嚴格相等比較這兩個算法:這兩個算法有點問題——就是不能區分 NaN 以及 +0 和 -0。因此在 ES2015 之前,我們會遭遇這樣的比較結果:

    ?
  • NaN?===?NaN?//?false?
  • +0?===?-0?//?true?
  • [NaN].indexOf(NaN)?//?-1?
  • [0].indexOf(-0)?//?-1?
  • NaN 與自身不相等,+0 等于 -0。在意識中,我們可能接受不了“NaN 與自身不相等”的結果,但是能夠理解“+0 等于 -0”(都是 0 嘛),但是在某些符號位具有含義的場景中——- 表示向左,+ 表示向右,那么區分 +0 等于 -0 就有意義了。

    基于此,ES2015 中引入了 SameValue 算法,Object.is() 方法內部就是使用此算法,比較兩個值是否相等。

  • Object.is(NaN,?NaN)?//?true?
  • Object.is(0,?-0)?//?false?
  • SameValueZero 算法,通過名稱我們可能就猜到,與 SameValue 算法的區別,僅僅是對“零”的態度上——SameValueZero 算法不能區分 +0 和 -0。

    就是說:

  • var?array?=?[NaN,?-0]?
  • array.includes(NaN)?//?true?
  • array.includes(0)?//?true?
  • array.includes(0) 的結果沒有返回 false,是因為其內部使用的 SameValueZero 算法不能區分 +0 和 -0。

    閱讀目錄(置頂)(長期更新計算機領域知識)

    閱讀目錄(置頂)(長期更新計算機領域知識)

    閱讀目錄(置頂)(長期科技領域知識)

    歌謠帶你看java面試題

    總結

    以上是生活随笔為你收集整理的第九十六期:JavaScript 中的 4 个相等比较算法的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。