1. typeof
typeof null === ‘object’ // true
2. NaN
typeof(NaN) // "number"
alert(NaN == NaN) // false,NaN和任何值都不相等
alert(NaN === NaN) // false,任何涉及 NaN的操作都會返回NaN。
2.1 哪些情況會返回NaN
- 計算
JS 在進行加減乘除運算之前,會先調用 Number()方法,將非數值的運算項轉化爲數值,如果轉換失敗就返回NaN:
1-'a'; // NaN
1-'1' // 0
- 類型轉換
'1'+2+3
//記住,parseInt是儘量轉化成功
parseInt('123ab') //123
Number('123ab') // NaN
Number('123') // 123
Number([]); // 0
parseInt([]); // NaN
parseFloat([]); // NaN
Number([]); // 0
parseInt([]); // NaN
parseFloat([]); // NaN
2.2 isNaN和Number.isNaN
isNaN 是window對象的一個方法,比較詭異的是:isNaN(x)並不是判斷參數x本身是不是NaN,而是判斷Number(x)是不是NaN。
// isNaN原理
var isNaNA = function(value) {
var n = Number(value);
return n !== n;
};
isNaN(NaN); // true
isNaN(123); // false
isNaN('abc'); //true
isNaN('123abc'); //true
isNaN({}); // true,因爲Number({})=NaN
isNaN(''); // false, 因爲Number('')=0
isNaN([]); // false,因爲Number([])=0
Number.isNaN 修復了isNaN(), 不會強制轉化參數,直接對參數本身做判斷,這樣只有參數顯示等於NaN,纔會返回true.
// 原理
function isNaNC (value) {
return typeof(value) === "number" && isNaN(value);
}
3. 常規題目
3.1 連續賦值的輸出
function A(){
var a = b = 100
}
A()
console.log(a) // 報錯
console.log(b) // 100, 這裏的b是全局變量
3.2 js精度問題
console.log(0.1+0.2 === 0.3) // false
console.log(0.3+0.2 === 0.5) // true
主要是計算機對數字的存儲是以二進制方式,有些小數轉化成二進制的時候會變成一個無限循環的樹,造成了精度的問題。
解決問題方式:
- 設置一個誤差值
if (!Number.EPSILON) {
Number.EPSILON = Math.pow(2, -52);
}
function numbersCloseEnoughToEqual(a, b) {
return Math.abs(a - b) < Number.EPSILON
}
- 同時擴大100倍