大廠面經---js基礎篇typeof/NaN/以及一些常規題目

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
  1. 計算
    JS 在進行加減乘除運算之前,會先調用 Number()方法,將非數值的運算項轉化爲數值,如果轉換失敗就返回NaN:
1-'a'; // NaN
1-'1'  // 0
  1. 類型轉換
'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倍
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章