日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
為何null>0,null==0為false,而null>=0為true?

前言

javaScript中有很多異于常人思維的邏輯,比如null > 0, null == 0都為false,但null >= 0 卻為true。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺(tái)小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了懷安免費(fèi)建站歡迎大家使用!

有些人看到這里覺得這怎么可能,于是跑到瀏覽器控制臺(tái)嘗試執(zhí)行了一番,執(zhí)行后的結(jié)果,讓自己大吃一驚。

心想自己可能因?yàn)檫@個(gè)寫了不少bug,今天又學(xué)到了一個(gè)知識(shí)點(diǎn),但這你要不去了解它的執(zhí)行原理,估計(jì)你怎么都想不通。

下面我們就嘗試去一探究竟吧!

ToPrimitive 算法

JavaScript 對(duì)象轉(zhuǎn)換到基本類型值時(shí),會(huì)使用 ToPrimitive 算法,這是一個(gè)內(nèi)部算法,是編程語言在內(nèi)部執(zhí)行時(shí)遵循的一套規(guī)則。

hint

ToPrimitive 算法在執(zhí)行時(shí),會(huì)被傳遞一個(gè)參數(shù) hint,表示這是一個(gè)什么類型的運(yùn)算(也可以叫運(yùn)算的期望值),根據(jù)這個(gè) hint 參數(shù),ToPrimitive 算法來決定內(nèi)部的執(zhí)行邏輯。

hint 參數(shù)的取值只能是下列 3 者之一:

  • string
  • number
  • default

toPrimitive轉(zhuǎn)換規(guī)則

如果傳入?yún)?shù)是string,也就是對(duì)象到字符串的轉(zhuǎn)換」,經(jīng)過了如下步驟:

  • 如果對(duì)象中有toString()方法,則調(diào)用這個(gè)方法。如果它返回一個(gè)原始值(undefined、Boolean、Number、String、BigInt、Symbol 和 null),js將這個(gè)值轉(zhuǎn)換為字符串(如果本身不是字符串的話),并返回這個(gè)字符串結(jié)果。
  • 如果對(duì)象沒有toString()方法,或者toString()沒有返回一個(gè)原始值,那么js會(huì)調(diào)用valueOf()方法。如果返回值是原始值,js將這個(gè)值轉(zhuǎn)換為字符串,并返回字符串結(jié)果。
  • 否則,js拋出一個(gè)類型錯(cuò)誤異常。

「如果傳入?yún)?shù)是number/default,也就是對(duì)象到數(shù)字的轉(zhuǎn)換」,經(jīng)過了如下步驟:

和上面有點(diǎn)不同,到數(shù)字的轉(zhuǎn)換會(huì)先嘗試使用valueOf()方法

  • 如果對(duì)象具有valueOf()方法,后者返回一個(gè)原始值,則js會(huì)將其轉(zhuǎn)換為數(shù)字(如果需要的話)并返回這個(gè)數(shù)字。
  • 否則,如果對(duì)象具有toString()方法,返回一個(gè)原始值(字符串直接量),則js將其轉(zhuǎn)換為數(shù)字類型,并返回這個(gè)數(shù)字。
  • 否則,js拋出一個(gè)類型錯(cuò)誤異常。

抽象關(guān)系比較算法

  1. 調(diào)用 b 的 ToPrimitive(hit Number) 方法.
  2. 調(diào)用 a 的 ToPrimitive(hit Number) 方法.
  3. 如果此時(shí) Result(1) 與 Result(2) 都是字符串,跳到步驟 16.
  4. 調(diào)用 ToNumber(Result(1)).
  5. 調(diào)用 ToNumber(Result(2)).
  6. 如果 Result(4) 為 NaN, return undefined.
  7. 如果 Result(5) 為 NaN, return undefined.
  8. 如果 Result(4) 和 Result(5) 是相同的數(shù)字,return false.
  9. 如果 Result(4) 為 +0, Result(5) 為 -0, return false.
  10. 如果 Result(4) 為 -0, Result(5) 為 +0, return false.
  11. 如果 Result(4) 為 +∞, return false.
  12. 如果 Result(5) 為 +∞, return true.
  13. 如果 Result(5) 為 -∞, return false.
  14. 如果 Result(4) 為 -∞, return true.
  15. 如果 Result(4) 的數(shù)值大小小于 Result(5),return true,否則 return false.
  16. 如果 Result(2) 是 Result(1) 的前綴 return false. (比如 "ab" 是 "abc" 的前綴)
  17. 如果 Result(1) 是 Result(2) 的前綴, return true.
  18. 找到一個(gè)位置 k,使得 a[k] 與 b[k] 不相等.
  19. 取 m 為 a[k] 字符的數(shù)值.
  20. 取 n 為 b[k] 字符的數(shù)值.
  21. 如果 m < n, return true,否則 return false.

判斷null>0

按照上面這個(gè)步驟,我們可以嘗試來判斷一下null>0的結(jié)果

首先第一二步就是為它們分別調(diào)用ToPrimitive()將這兩個(gè)值轉(zhuǎn)換為原始類型,由于這兩個(gè)值都是基本類型,所以他們轉(zhuǎn)換后還是本身

然后第三步就不適用,我們接著看第四五步,將兩個(gè)值都轉(zhuǎn)為Number類型,null轉(zhuǎn)換成了+0,而0還是0。

接著看六七,由于兩者都不是NaN,所以我們直接看第八步,在js中+0與0是一樣的,所以返回false

null > 0 // false
null < 0 // false

抽象相等比較算法

  1. 如果 a 與 b 的類型相同,則:
  • 如果 Type(b) 為 undefined,return true.
  • 如果 Type(b) 為 null,return true.
  • 如果 Type(b) 為 number,則:
  • 如果 b 為 NaN,return false.
  • 如果 a 為 NaN,return false.
  • 如果 a 與 b 數(shù)值相同,return true.
  • 如果 a 為 +0,b 為 -0,return true.
  • 如果 a 為 -0,b 為 +0,return true.
  • 否則 return false.
  • 如果 Type(b) 為 string,且 a 與 b 是完全相同的字符串,return true,否則 return false.
  • 如果 Type(b) 是 boolean,如果都是 true 或 false,return true,否則 return false.
  • 如果 a 與 b 是同一個(gè)對(duì)象引用,return true,否則 return false.
  1. 如果 a 為 null,b 為 undefined,return true.
  2. 如果 a 為 undefined,b 為 null,return true.
  3. 如果 Type(a) 為 number,Type(b) 為 string,返回 a == ToNumber(b) 的結(jié)果.
  4. 如果 Type(a) 為 string,Type(b) 為 number,返回 ToNumber(a) == b 的結(jié)果.
  5. 如果 Type(a) 為 boolean,返回 ToNumber(a) == b 的結(jié)果.
  6. 如果 Type(b) 為 boolean,返回 a == ToNumber(b) 的結(jié)果.
  7. 如果 Type(a) 是 string 或 number,且 Type(b) 是對(duì)象類型,返回 a == ToPrimitive(b) 的結(jié)果.
  8. 如果 Type(a) 是對(duì)象類型,且 Type(b) 是 string 或 number,返回 ToPrimitive(a) == b 的結(jié)果.
  9. 否則 return false.

判斷null==0

null == 0 // false

null == 0 走到了第 10 步,返回了默認(rèn)的 false。

大于等于操作符>=

從常理上來講,如果null>0為false,null==0也為false,那么null>=0肯定也為false。但事實(shí)并非如此

javascript 是這么定義大于等于判斷的:

如果 a < b 為 false,則 a >= b 為 true

這個(gè)規(guī)則是不是有點(diǎn)逆于常人思維,但它卻又是合理的,當(dāng)a=b肯定就為true對(duì)吧

所以null>=0為true,是因?yàn)閚ull<0為false,看到這里,是不是又恍然大悟了呢?


文章標(biāo)題:為何null>0,null==0為false,而null>=0為true?
網(wǎng)站URL:http://www.dlmjj.cn/article/dpphsod.html