JS中的NaN和isNaN,簡直是雙重人格?


 number數字類型
  包括數字和NaN,NaN:not a number 但是它是數字類型的
 
isNaN的用法:檢測當前值是否不是有效數字,返回true代表不是有效數字,返回false是有效數字
//=>語法:isNaN([value])
var num=12;
isNaN(num); //->檢測num變量存儲的值是否為非有效數字 false

isNaN('13') =>false
isNaN('你好呀') =>true
isNaN(true) =>false
isNaN(false) =>false
isNaN(null) =>false
isNaN(undefined) =>true
isNaN({age:9}) =>true
isNaN([12,23]) =>true
isNaN([12]) =>false
isNaN(/^$/) =>true
isNaN(function(){}) =>true
1、isNaN檢測的機制:首先驗證當前要檢測的值是否為數字類型的,如果不是,瀏覽器會默認的把值轉換為數字類型

  把非數字類型的值轉換為數字
  其它基本類型轉換為數字:直接使用Number這個方法轉換的
 
[字符串轉數字]
Number('13') ->13
Number('13px') ->NaN 如果當前字符串中出現任意一個非有效數字字符,結果則為NaN
Number('13.5') ->13.5 可以識別小數

[布爾轉數字]

Number(true) ->1
Number(false) ->0
[其它]
Number(null) ->0
Number(undefined) ->NaN
  
把引用數據類型值轉換為數字:先把引用值調取toString轉換為字符串,然后再把字符串調取Number轉換為數字

[對象]
({}).toString() ->'[object Object]' ->NaN
[數組]
[12,23].toString() ->'12,23' ->NaN
[12].toString() ->'12' ->12
[正則]
/^$/.toString() ->'/^$/' ->NaN
[其他]
Number('') ->0
[].toString() -> ''
=> isNaN([]):false
 
2、當前檢測的值已經是數字類型,是有效數字返回false,不是返回true(數字類型中只有NaN不是有效數字,其余都是有效數字)
 
  parseInt / parseFloat等同於Number,也是為了把其它類型的值轉換為數字類型
 
  和Number的區別在於字符串轉換分析上
 
  Number:出現任意非有效數字字符,結果就是NaN
    parseInt:把一個字符串中的整數部分解析出來,parseFloat是把一個字符串中小數(浮點數)部分解析出來  
parseInt('13.5px') =>13
parseFloat('13.5px') =>13.5
parseInt('width:13.5px') =>NaN 從字符串最左邊字符開始查找有效數字字符,並且轉換為數字,但是一但遇到一個非有效數字字符,查找結束
 
3. NaN的比較
 
  NaN==NaN:false NaN和誰都不相等,包括自己
 
if(Number(num)==NaN){
  alert('num不是有效數字!');
 }
NaN和誰都不相等,條件永遠不成立(即使num確實不是有效數字,轉換的結果確實是NaN,但是NaN
!=NaN的) if(isNaN(num)){   //=>檢測是否為有效數字,只有這一種方案   alert('num不是有效數字!') }

 

【布爾 boolean】

      只有兩個值:true / false,把其它數據類型的值轉換為布爾類型:除了“NaN/0/''/null/undefined”這五個值會轉換為false,其余的都會轉換為true
    哪些情況需要把其它類型值轉換為布爾呢?
  
// [手動自己轉]
Boolean(0) => false
Boolean([]) => true
[]==false => true   // 都轉換為數字 0==0
![]==false => true  // 先算![],把數組轉換為布爾取反=>false =>false==false
  除了Boolean可把其他類型轉化為數字類型外,!和雙!!也是把其他類型轉化成布爾類型,項目中一般用!!轉換(逼格高~)
  !0 =>true 嘆號在這里是取反的意思(先轉化為布爾類型然后再取反)
  !!0 =>false 兩個嘆號只剩下轉換為布爾類型了,等價於Boolean
// [程序自己需要轉換 =>一般都是條件判斷的時候],if內的值會默認轉換成布爾類型,如果為真執行,為false則不執行
if(1){
   //=>如果條件成立,執行大括號中的代碼
   //=>瀏覽器會把1作為條件:把它轉換為布爾的TRUE,條件成立
}
 
特殊情況:數學運算和字符串拼接 “+”
  當表達式中出現字符串,就是字符串拼接,否則就是數學運算
1+true =>2  //數學運算
'1'+true =>'1true'   //字符串拼接
[12]+10 =>'1210'     //雖然現在沒看見字符串,但是引用類型轉換為數字,首先會轉換為字符串,所以變為了字符串拼接
({})+10 =>"[object Object]10"
[]+10 =>"10"
  {}+10 =>10     結果為10,但是這個和以上說的沒有半毛錢關系,因為它根本就不是數學運算,也不是字符串拼接,它是兩部分代碼
  {} 代表一個代碼塊(塊級作用域)   +10 才是我們的操作      嚴格寫法:{}; +10;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM