keywords:nonvalue,NaN,infinity

特殊值

各種型別都有幾個特殊的值( special values ),我們應該都該知道它們的存在,以及正確的使用它們。

非值 ( Nonvalue ) 的值

  • null 是一個空值,是一個特殊的關鍵字,而非一個識別字,因此不能當它是變數,想指定值給它
  • undefined 代表尚未有值,是一個內建識別字,要取得這個值的一個方式是透過 void 運算子
    • void 運算子會讓任何值變得空無所有,永遠都是 undefined 值,要藉由 void 單獨表示 undefined 可以使用 void 0
    • void 'hi'; // undefined
    • void ( ()=> console.log('hi') ); // undefined
    • void null; // undefined

非數字的數字 ( NaN )

進行數學運算時,如果兩個運算元( operands )都不是 number ( 或可被解讀為正規的十進位或十六進位 number 的值 ) ,該運算就無法產生一個有效的值,這時就會得到 NaN 值。

  • NaN 代表 not a number 不是一個數字,但較精確的說法是無效的數字 ( invalid number )、不合格的數字 ( failed number )、壞掉的數字 ( bad number )

      let a = 9 / 'egg'; // NaN
    
      typeof a // number
    
  • NaN 的型別就是 number ,NaN 是一種哨符值 ( sentinel value ,即被指定了特殊意義的普通值 ),表示 number 集合中特殊錯誤情況,大概就是『 我試著進行一項數學運算,但失敗了,所以這裡改放失敗的 number 結果 』
  • 如果想測試某變數是否為 NaN,不能直接跟 NaN 本身做比較 what the O.o!?

      let a = 9 / 'egg';
    
      a; // NaN
    
      a == NaN; // false
    
      a === NaN; // false   what!? 😮
    
  • NaN 永遠不等於自己,它是唯一一個非反身 ( not reflexive ) 值( 即沒有恆等性 x === x )

      Nan !== NaN; // true
    
      Nan == NaN; // false
    
      Nan === NaN; // false
    
  • 如果要進行比較是否為 NaN 可以使用 .isNaN(),但是全域工具函式有一個嚴重的缺陷 ( 又一個臭蟲!!! ),還好 ES6 有提供一個代替工具

      let a = 9 / 'egg';
    
      let b = 'egg';
    
      a; // NaN
    
      b; // 'egg'
    
      ------------------------------------------
    
      全域工具
    
      window.isNaN(a); //true
    
      window.isNaN(b); // true  Bug!!! what!!!?
    
      ------------------------------------------
    
      ES6
    
      Number.isNaN(a); // true
    
      Number.isNaN(b); // false 呼!!
    
  • NaN 是整個語言中唯一永遠不等於自己,其他所有的值永遠都相等於自己

      undefined === undefined; // true
    
      NaN === NaN; // false
    
      '123' === '123'; // true
    
      ------------------------------------------
    
      型別為 Object 的值是比較參考是否為同一個來源,故下方三個型別為 Object 的不會等於自己 ( function 為 Object 的子型別 )
    
      [] === []; // false
    
      {} === {}; // false
    
      (function abc(){}) === (function abc(){}); // false
    
      ------------------------------------------
    
      let a = [1,2,3];
    
      let b = a;
    
      b === a; // true
    

無限 ( Infinity )

在 C 語言如果用 1 / 0 通常都會看到編譯器錯誤( compiler error )或是執行期例外( runtime exception ),但是在 JavaScript 這個作業有明確定義的產生 Infinity 這個值,如果變數成了 infinity 那就沒辦法再回到有限

    let a = 1 / 0; // Infinity

    let b = -1 / 0; // -Infinity

    Number.POSITIVE_INFINITY; // Infinity

    Number.NEGATIVE_INFINITY; // -Infinity

    Infinity / Infinity; // NaN   不等於 1 也不等於 Infinity

特殊相等性

ES6 有一個新工具可以測試兩個值是否絕對相等 Object.is(..)

    let a = 9 / 'egg';  // NaN

    let b = -9 * 0 ;  // -0

    Object.is(a,NaN); // true

    Object.is(b,-0); // true

    object.is(b,0); // false
#nonvalue #NaN #Infinity







你可能感興趣的文章

統一建模語言 UML

統一建模語言 UML

[JS101] 判斷式

[JS101] 判斷式

[6] 進階資料型別 part1 - 字串、List 操作

[6] 進階資料型別 part1 - 字串、List 操作






留言討論