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