精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

NaN你都未必懂,花五分鐘讓你懂得不能再懂

開發 前端
NaN全稱是Not-A-Number,不是一個數字。在 JavaScript 中,整數和浮點數都統稱為 Number 類型。

[[431097]]

NaN和Number.NaN

NaN全稱是Not-A-Number,不是一個數字。在 JavaScript 中,整數和浮點數都統稱為 Number 類型。

特點1 typeof是數字

口上說不是一個數字,typeof的值卻是number, 口是心非。

ES6之后,Number也多了一個靜態屬性NaN

  1. typeof NaN // number 
  2. typeof Number.NaN // number 

特點2 我不等于我自己

我否定我自己,也就這家了。硬要說,還有一個+0和 -0

  1. NaN == NaN  // false 
  2. Number.NaN == NaN // false 
  3. NaN === NaN // false 
  4. Number.NaN === NaN  // false 
  5.  
  6. +0 == -0 // true 
  7. Object.is(+0, -0) // fasle 

NaN的描述信息

其是一個值,新的ES標準中, 不可配置,不可枚舉。也就是說不可以被刪除delete,不可以被改寫, 也不可以改寫配置。

  1. delete NaN // false 
  2. NaN = 1 // 1 
  3. NaN == 1 // false 
  4.  
  5. delete Number.NaN // false 
  6. Number.NaN = 1 // 1 
  7. Number.NaN == 1 // false 

我們嘗試改寫:

使用Reflect.defineProperty 而不使用Object.defineProperty,因為前者能準確告訴你是否成功,而后者返回的被定義的對象。

  1. const success =Reflect.getOwnPropertyDescriptor(window, 'NaN'), { 
  2.     writable: true
  3.     configurable: true
  4. }) 
  5. console.log(success) // false 
  6. Reflect.getOwnPropertyDescriptor(window, 'NaN'
  7. // {value: NaN, writable: false, enumerable: false, configurable: false

結果是無法改寫,所以不要打他的小心思。

常見的場景

計算, 類型轉換是典型的場景

  1. let print = console.log; 
  2. // parseInt  
  3. print(isNaN(parseInt("zz123"))) // true 
  4.  
  5. // parseFloat  
  6. print(isNaN(parseFloat("zz123"))) // true 
  7.  
  8. // 直接Number初始化 
  9. print(isNaN(Number("zz123"))) // true 
  10.  
  11. // 數字運算 
  12. print(isNaN(0 / 0 ))  // true 
  13. print(isNaN( 1 * "zz123" )) // true 
  14. print(Math.sqrt(-1)) // true 

isNaN

isNaN() 是一個全局方法。

其本質是檢查 toNumber 返回值, 如果是NaN,就返回 true,反之返回 false 。

可以簡化為語義:

  1. Number.isNaN =  function (val){ 
  2.    return Object.is(Number(val), NaN);  

toNumber 方法, 大致的邏輯如下:

le 15: ToNumber Conversions

Argument Type Result
Undefined Return NaN.
Null Return +0𝔽.
Boolean If argument is true, return 1𝔽. If argument is false, return +0𝔽.
Number Return argument (no conversion).
String Return ! StringToNumber(argument).
Symbol Throw a TypeError exception.
BigInt Throw a TypeError exception.

關于對象的轉換是:

1. Let primValue be ? ToPrimitive(argument, number).

2. Return ? ToNumber(primValue).

簡單翻譯就是先獲取原始類型的值,再轉為Number。

取原值,也會根據條件執行不同的方法。

最優先調用 Symbol.toPrimitive, 如果存在

根據條件決定是先調用 valueOf 還是toString

對象這里就比較有意思了, 看下面的例子, valueOf的返回,可以直接影響isNaN的值。

  1. let print = console.log; 
  2. var person = { 
  3.     age: 10, 
  4.     name"tom"
  5.     valueOf(){ 
  6.         return this.name  
  7.     } 
  8. print(isNaN(person))  // true 
  9.  
  10.  
  11. let print = console.log; 
  12. var person = { 
  13.     age: 10, 
  14.     name"tom"
  15.     valueOf(){ 
  16.         return this.age  
  17.     } 
  18. print(isNaN(person))  // false 

常規例子:

  1. let print = console.log; 
  2. print(isNaN("123")) //false 
  3. print(isNaN('zz123')) //true 
  4. print(isNaN(NaN)) //true 

isNaN是可以被刪除的,但是不可被枚舉:

  1. delete isNaN // true 
  2. typeof // undefined 
  3.  
  4. isNaN = 1  // 1 
  5. isNaN == 1  //true 

屬性描述信息:

Number.isNaN

判斷一個值是否是數字,并且值等于NaN.

ES標準的描述:

  1. If Type(number) is not Number, return false
  2. If number is NaN, return true
  3. Otherwise, return false

所有可以語義化為:

  1. Number.isNaN = function(val){ 
  2.    if(typeof val !== "number"){ 
  3.        return false 
  4.    } 
  5.    return Object.is(val, NaN); 

demo:

  1. let print = console.log; 
  2.  
  3. print(Number.isNaN(NaN))  // true 
  4. print(Number.isNaN("123")) //false 

isNaN和Number.isNaN的區別

Number.isNaN是嚴格判斷, 必須嚴格等于NaN。是不是NaN這個值

isNaN是通過內部的 toNumber 轉換結果來判定的。Number轉換的返回值是不是NaN

Number.isNaN是ES6的語法,固然存在一定的兼容性問題。

Object.is

ES6標準新增方法,用于判斷兩個值是否屬于同一個值,其能準確的判斷NaN。

  1. let print = console.log; 
  2.  
  3. print(Object.is(NaN, NaN)); // true 
  4. print(Object.is("123", NaN)) // false 

嚴格判斷NaN匯總

四種,2種ES6, 2種ES5。

  1. Number.isNaN(NaN) // true 
  2. Number.isNaN(1) // false 

Object.is (ES6)

  1. function isNaNVal(val){ 
  2.     return Object.is(val, NaN); 
  3. isNaNVal(NaN) // true 
  4. isNaNVal(1) // false 

自身比較 (ES5)

最為簡單的一種方式。

  1. function isNaNVal(val){ 
  2.     return val !== val; 
  3. isNaNVal(NaN) // true 
  4. isNaNVal(1) // false 

typeof + NaN (ES5)

這是MDN推薦的墊片,有些兼容低版本的庫就是這么實現的, 也是ES標準的精準表達

  1. function isNaNVal(val){ 
  2.     return typeof val === 'number' && isNaN(val) 

綜合的墊片

  1. if(!("isNaN" in Number)) { 
  2.     Number.isNaN = function (val) { 
  3.       return typeof val === 'number' && isNaN(val) 
  4.     } 

深究數組的indexOf與includes

三心醬在50個JS高級知識點有提到 includes能識別 NaN, 我們繼續來一看究竟。

  1. var arr=[NaN]; 
  2. arr.indexOf(NaN) // -1 
  3. arr.includes(NaN) // true 

includes

我們深入規范看一看:

ES標準的Array.prototype.includes 比較值相等調用的是內部的 SameValueZero ( x, y )方法,其會檢查值第一值是不是數字,如果是數字,調用的是 Number::sameValueZero(x, y), 其具體比較步驟:

  1. 1. If x is NaN and y is NaN, return true
  2.  
  3. 2. If x is +0?? and y is -0??, return true
  4.  
  5. 3. If x is -0?? and y is +0??, return true
  6.  
  7. 4. If x is the same Number value as y, return true
  8.  
  9. 5. Return false

其先對NaN進行了比較,所以能檢查NaN, 這里還有一個額外信息,比較的時候+0和-0是相等的, 要區分+0和-0還得用Object.is

indexOf

ES標準中 Array.prototype.indexOf 值比較調用的是IsStrictlyEqual(searchElement, elementK), 其如果檢查到第一個值為數字,調用的 Number::equal(x, y).

其比對邏輯

  1. 1. If x is NaN, return false. 2. If y is NaN, return false. 3. If x is the same Number value as y, return true. 4. If x is +0𝔽 and y is -0𝔽, return true. 5. If x is -0𝔽 and y is +0𝔽, return true
  2. 6. Return false

可以看到,任何一個為NaN,就直接返回false,必然不能嚴格的檢查NaN.

Number::sameValueZero 和 Number::sameValue

區別

在上個章節我們提到了,Array.prototype.includes值的比較實用的是 Number::sameValueZero , 突出了Zero, Zero是什么,是0啊,也就是說對0進行了特殊的處理。

對應的還要一個 Number::sameValue 方法, 一起看看:

可以看出Number::sameValueZero 不區分+0 -0, Number::sameValue 則區分。

  1. Object.is(+0, -0) // false, 區分+0,-0 
  2. [-0].includes(+0) // true,不區分+0,-0 

BigInt::sameValue和 BigInt:samgeValueZero

圖片可以看出,除了Number有, BigInt也有相似的比較。

這兩個方法的主要應用場景也就是 Object.is 和 Array.prototype.includes。

再猜猜下面的結果:

  1. Object.is(BigInt(+0),BigInt(-0)) 
  2. Object.is(-0n,0n) 
  3. Object.is(-0,0) 
  4. [BigInt(+0)].includes(BigInt(-0)) 

3

2

1

結果,不如你所愿:

  1. Object.is(BigInt(+0),BigInt(-0))   // true 
  2. Object.is(-0n,0n) // true 
  3. Object.is(-0,0) // false 
  4. [BigInt(+0)].includes(BigInt(-0))  // false 

哈哈,更多細節 BigInt::equal ( x, y ):

核心解釋:

BigInt::sameValue ( x, y ) 調用 BigInt::equal ( x, y )

  1. BigInt::equal ( x, y ) 
  2. 1. If ℝ(x) = ℝ(y), return true; otherwise return false

而R(x)是啥玩意

  1. 從 Number 或 BigInt x 到數學值的轉換表示為“ x 的數學值”或 R(x)。+ 0F 和-0F的數學值為0 

簡單的結論:

  • Number區分+0,- 0
  • BitInt不區分

BigInt::sameValue和 BigInt:samgeValueZero有什么區別呢?

用一張圖,更好解釋:

沒有區別,更合理的解釋是什么呢??

小結

indexOf是ES5甚至更早的產物,includes是ES6的產物。高級產物向著更合理化的方向發展,合情合理。

至于為什么不升級indexOf呢,歷史包袱吧,以前的代碼總不能讓其產生意外效果吧。

 

責任編輯:武曉燕 來源: 云的程序世界
相關推薦

2017-07-12 09:54:33

深度學習AI 人工智能

2009-11-05 10:56:31

WCF通訊

2021-03-04 09:26:57

微服務架構數據

2024-04-28 12:55:46

redis頻道機制

2021-11-07 23:46:32

MySQLSQL索引

2020-12-08 10:02:25

RESTfulAPI開發

2009-11-06 16:05:37

WCF回調契約

2020-11-09 09:59:50

Ajax技術

2021-11-11 15:03:35

MySQLSQL索引

2017-12-19 10:10:47

2017-06-07 18:40:33

PromiseJavascript前端

2022-03-08 08:39:22

gRPC協議云原生

2025-07-25 07:26:51

2009-10-29 11:39:52

ADO.NET連接池

2024-02-21 21:19:18

切片Python語言

2024-08-02 08:31:08

2023-07-15 18:26:51

LinuxABI

2015-12-03 14:10:26

systemd容器Linux

2015-11-12 10:32:40

GitHub控制系統分布式

2020-11-06 08:54:43

Vue 3.0函數代碼
點贊
收藏

51CTO技術棧公眾號

www一区二区三区| av中文字幕一区二区三区| 激情av一区| 精品中文字幕久久久久久| 成年人视频在线免费| 午夜免费福利在线观看| 成人午夜激情在线| 国产精品欧美一区二区三区奶水| 18岁成人毛片| 免费久久精品| 日韩精品中文字幕在线一区| 免费观看日韩毛片| 成人午夜在线影视| 久久久久久久综合| 成人黄动漫网站免费| 伊人久久中文字幕| 亚洲黄色成人| 波霸ol色综合久久| 久操视频免费看| 亚洲国产欧美在线观看| 欧美性生活影院| www..com日韩| 超碰免费在线播放| 国产女人aaa级久久久级| 国产欧美日韩一区| 国产三级在线观看视频| 国产精品一二| 欧美激情图片区| 极品魔鬼身材女神啪啪精品| av亚洲免费| 日韩成人av一区| 成人欧美在线观看| 欧美一区二区三区在线播放 | 高清视频一区二区三区| 小泽玛利亚一区二区三区视频| 亚洲精品欧洲| 欧美精品激情blacked18| 亚洲精品电影院| 精品国精品国产自在久国产应用| 亚洲精品电影网站| 黄色在线免费播放| 91大神精品| 日韩欧美www| 26uuu国产| 亚洲视频一起| 精品国内二区三区| 女同性αv亚洲女同志| 国产一区二区三区视频在线| 欧美精品v国产精品v日韩精品 | 中文字幕一区二区人妻| 久久在线精品| 国产97色在线|日韩| 成人午夜淫片100集| 先锋影音久久久| 欧美中文字幕在线视频| 欧美h在线观看| 久久久久久亚洲精品杨幂换脸| 欧美一性一乱一交一视频| 中文字幕亚洲精品一区| 免播放器亚洲| 国产精品久久av| 岳乳丰满一区二区三区| 精品一区二区在线看| 亚洲综合中文字幕在线| 风流老熟女一区二区三区| va亚洲va日韩不卡在线观看| 久久国产精品久久| 国产一级免费在线观看| 国产精品色眯眯| 国产手机视频在线观看| 亚洲七七久久综合桃花剧情介绍| 亚洲国产中文字幕| 欧美在线观看www| 欧美日韩亚洲国产| 91精品国产日韩91久久久久久| 激情成人在线观看| 丁香五月缴情综合网| 亚洲女人天堂视频| 欧美乱大交做爰xxxⅹ小说| 一本一道久久a久久精品蜜桃 | 成人激情小说网站| 久久免费视频1| 在线观看黄色av| 亚洲综合免费观看高清完整版| 国产极品尤物在线| 精品欧美日韩精品| 日韩三级视频中文字幕| a级在线观看视频| 91视频综合| 性欧美xxxx视频在线观看| 自拍偷拍精品视频| 国产高清不卡一区二区| 欧美日本韩国国产| 成年人黄视频在线观看| 色综合久久综合网| 日本高清免费在线视频| 亚洲宅男网av| 久久躁狠狠躁夜夜爽| 青青草成人av| 黄页网站大全一区二区| 欧美成人第一区| 成人影院www在线观看| 欧美性猛交xxxx富婆| 中文字幕在线视频精品| 婷婷成人影院| 欧美老肥婆性猛交视频| 香蕉污视频在线观看| 国产成人激情av| 亚洲一卡二卡三卡| 在线观看涩涩| 精品国产免费久久| www.com.av| 久久综合亚州| 好吊妞www.84com只有这里才有精品| 香蕉视频在线播放| 色婷婷狠狠综合| 黄色激情在线观看| 91精品国产自产拍在线观看蜜| 国产91在线播放| 天天干天天做天天操| 亚洲欧美日本在线| 国产又大又黄又猛| 国产欧美高清视频在线| 午夜精品久久久久久久男人的天堂 | 欧美精品大片| 91精品久久久久久久久不口人| 欧洲一级在线观看| 午夜精品成人在线| 2018国产精品| 欧美日韩国产探花| 亚洲xxxx18| 巨大荫蒂视频欧美大片| 在线观看国产91| 少妇特黄一区二区三区| 99成人精品| 国产欧美综合精品一区二区| 污污影院在线观看| 欧美一级国产精品| 波多野结衣爱爱视频| 理论电影国产精品| 亚洲综合视频一区| 日韩一级特黄| 久久精品免费电影| 国产乱淫av片免费| 亚洲色图欧美激情| 人妻体体内射精一区二区| 99视频精品全国免费| 国产日韩亚洲欧美| 蜜桃视频在线观看www社区| 欧美日韩卡一卡二| 日日操免费视频| 久久国产综合精品| 一区二区精品免费视频| 亚洲午夜国产成人| 久久躁日日躁aaaaxxxx| 精品国产亚洲AV| 亚洲午夜日本在线观看| av在线播放网址| 欧美一级播放| 日韩高清av电影| 日韩福利影视| 欧美日韩成人精品| 亚洲欧美日韩成人在线| 色视频一区二区| 亚洲欧美日韩第一页| 国内外成人在线视频| 欧美一区二区三区综合| 好吊妞国产欧美日韩免费观看网站| 97色在线观看免费视频| 日韩一区av| 精品视频一区三区九区| 91成人福利视频| av资源网一区| 国产一级特黄a大片免费| 999久久久精品国产| 成人18视频| 亚洲天堂手机| 精品国产一区二区三区久久| 亚洲欧美激情另类| 日韩欧美一区二区在线| 91视频免费看片| 国产91对白在线观看九色| 少妇高潮喷水久久久久久久久久| 青青草91久久久久久久久| 99久久99| 成人看片在线观看| 欧美另类极品videosbestfree| 水莓100国产免费av在线播放| 欧美午夜精品久久久| 久久久久久久久99| 国产亚洲短视频| 少妇愉情理伦片bd| 久久精品系列| 成人污网站在线观看| 免费看av成人| 成人免费视频视频在| 精品亚洲美女网站| 久久久久久国产精品三级玉女聊斋 | 成人激情久久| 欧美最近摘花xxxx摘花| 在线三级电影| 在线观看欧美视频| 日韩中文字幕免费观看| 欧美日韩免费观看一区二区三区| 黄色一级片免费看| 亚洲免费在线看| 国产一二三四区在线| 成人福利电影精品一区二区在线观看| 一区二区三区 日韩| 91久久视频| 色爽爽爽爽爽爽爽爽| 精品国产一区探花在线观看| 精品欧美一区二区久久久伦| 欧美一区一区| 国产美女91呻吟求| 91精品xxx在线观看| 性色av一区二区咪爱| 成人日日夜夜| 日韩色av导航| 成人在线免费视频| 亚洲欧美另类人妖| 天堂网在线播放| 精品欧美一区二区久久| 国产视频手机在线| 欧美日韩国产中文| 亚洲欧美一二三区| 日韩欧美在线视频观看| 在线观看国产亚洲| 亚洲成人tv网| 国产一级生活片| 一区二区三区日本| 印度午夜性春猛xxx交| 综合久久久久综合| 日本视频在线免费| 成人欧美一区二区三区在线播放| 国产18无套直看片| 中文字幕第一页久久| 男人的天堂av网| 国产亚洲精品7777| www.日本高清视频| 欧美激情一区二区三区四区| 一级黄色性视频| 久久精品人人做人人爽97| 波多野结衣 在线| 久久免费国产精品| 六月婷婷七月丁香| 国产三级三级三级精品8ⅰ区| 一色道久久88加勒比一| 日本一区二区三区国色天香| 欧美午夜激情影院| 中文字幕国产一区二区| 亚洲色偷偷综合亚洲av伊人| 日韩一区在线看| 青青草原免费观看| 亚洲成国产人片在线观看| 黄色小视频在线免费看| 精品久久久久久中文字幕一区奶水| 日韩成人免费在线观看| 欧美色视频日本版| 欧美日韩a v| 欧美精品丝袜久久久中文字幕| 国产精品嫩草影院桃色| 欧美xxxxxxxx| 欧洲亚洲精品视频| 正在播放国产一区| www.在线视频| 97av在线播放| 91久久久久久白丝白浆欲热蜜臀| 国产情人节一区| 一区二区在线免费播放| 久久久久久国产精品一区| 成人3d精品动漫精品一二三| 吴梦梦av在线| 精品成人一区| 久久人妻精品白浆国产| 久久成人久久鬼色| 中文字幕天堂av| 国产欧美一区二区三区鸳鸯浴 | av不卡在线看| 国产免费999| 国产福利视频一区二区三区| 亚洲国产精品成人综合久久久| 日本一区二区三区视频视频| 久久久久99精品成人片毛片| 欧美性猛xxx| av网站在线免费看| 精品亚洲一区二区三区在线观看 | 国产免费av高清在线| x99av成人免费| 日韩电影免费看| 国产综合视频在线观看| 久久男人av| 椎名由奈jux491在线播放| 亚洲欧洲另类| 亚洲综合激情视频| 99精品视频中文字幕| 亚洲熟女毛茸茸| 欧美视频在线看| 精品国自产在线观看| 亚洲色图av在线| 超碰在线最新网址| 国产一区二区在线免费| 亚洲第一二三区| 国产女主播自拍| 久久电影网站中文字幕| 丝袜美腿中文字幕| 亚洲黄一区二区三区| 日本欧美www| 日韩精品视频在线播放| 青草青在线视频| 国产欧美日韩91| 沈樵精品国产成av片| 久久综合久久网| 国产一区二区毛片| 青青草华人在线视频| 色综合久久综合| 天堂av中文在线资源库| 欧美丰满片xxx777| 99久久这里有精品| 伊人精品久久久久7777| 日韩电影一二三区| 精品久久久久久中文字幕人妻最新| 夜夜嗨av一区二区三区网页| 国产又粗又长又黄| 日韩中文字幕国产| 桃子视频成人app| 久久久久久久久久码影片| 亚洲国内精品| 国产日韩视频一区| 亚洲一区二区三区不卡国产欧美| 国产精品一品二区三区的使用体验| 夜夜嗨av色一区二区不卡| 亚洲女同av| 久久国产精品免费一区| 国产婷婷精品| 久久午夜夜伦鲁鲁片| 午夜精品视频一区| 秋霞欧美在线观看| 久久久日本电影| 好吊妞视频这里有精品| 性一交一乱一伧国产女士spa| 国产99久久久国产精品免费看 | 国产高清一区二区三区视频| 国产精品自拍网| 99久久精品网站| 中文字幕12页| 亚洲男女一区二区三区| 精品人妻少妇AV无码专区 | 成人免费网站视频| 日本在线播放一区| 日韩激情视频在线观看| a级黄色免费视频| 欧美久久一二三四区| 国产黄色在线观看| 成人免费看片网址| 亚洲深爱激情| 无码少妇一区二区| 欧美日韩视频在线观看一区二区三区| 午夜在线视频| 亚洲一区二区在线播放| 黄页网站一区| 久操视频免费看| 欧美精选午夜久久久乱码6080| 麻豆视频在线观看免费网站| 99久久一区三区四区免费| 亚洲小说区图片区| 成年人网站免费看| 欧美日韩在线播放一区| а√天堂资源地址在线下载| 国产精品 日韩| 久久婷婷久久| 成人免费精品动漫网站| 亚洲成人aaa| wwww亚洲| 午夜精品一区二区三区四区| 国产真实乱子伦精品视频| 国产污片在线观看| 亚洲视频欧洲视频| 国产精品免费精品自在线观看| 青青青免费在线| 国产精品国产自产拍高清av| 国产91免费在线观看| 国产精品夫妻激情| 欧美人成网站| 免费看黄色的视频| 91精品欧美综合在线观看最新| 第一中文字幕在线| 亚洲国产欧美日韩| 成人动漫一区二区| 亚洲一级黄色大片| 午夜精品久久17c| 91不卡在线观看| 国产熟妇搡bbbb搡bbbb| 欧美一区二区福利在线| 芒果视频成人app| 久久精品无码中文字幕| 国产精品色噜噜| 你懂的在线播放| 国产a一区二区| 久久精品国产99国产|