1、null 對於null有一個歷史存留的 bug,null是對象類型嗎?雖然我們使用 typeof 檢測null是對象類型,這其實是一個 bug。 1.1 原因是什麼 因為 JS 最初的版本是 32 位系統的,為了將性能將用低位存儲變數類型信息,000 開頭表示代表的是對象,此時null表示全零, ...
1、null
對於null有一個歷史存留的 bug,null是對象類型嗎?雖然我們使用 typeof 檢測null是對象類型,這其實是一個 bug。
1.1 原因是什麼
因為 JS 最初的版本是 32 位系統的,為了將性能將用低位存儲變數類型信息,000 開頭表示代表的是對象,此時null表示全零,所以系統就錯誤的將null判斷為對象類型。雖然 JS 內部判斷代碼已經更改,但是這個 bug 一直留存下來。
2、symbol
有關symbol使用的比較少,但是它的存在是有原因的。
2.1 symbol 是什麼
symbol表示獨一無二的值,因為由於對象的屬性都是字元串類型,我們避免不了相同字元串衝突的問題。所以為了防止對象的屬性都是字元串類型而衝突引入的。
2.2 symbol 的使用
// 通常參數是字元串類型,如果為對象類型,就會調用 toString 方法
let s1 = Symbol(參數);// 這個參數可以認為是 Symbol 實例的一個描述,用於區分
// 第一種寫法
let a = {};
a[s1] = 'Hello!';
// 第二種寫法
let a = {
[s1] = 'Hello';
}
3、為什麼 0.1 + 0.2 != 0.3
0.1 + 0.2 __ 0.3呢?為什麼會出現不相等的情況呢?面試該如何回答面試官?
3.1 是什麼導致了這種情況
原因很簡單,JS 採用的是雙精度版本,這個版本就存在精度問題,就導致了上邊這種情況。
3.2 內部的原理是什麼
我們電腦的信息全部轉化為二進位進行存儲的,那麼0.1的二進位表示的是一個無限迴圈小數,該版本的 JS 採用的是浮點數標準需要對這種無限迴圈的二進位進行截取,從而導致了精度丟失,造成了0.1不再是0.1,截取之後0.1變成了 0.100...001,0.2變成了0.200...002。所以兩者相加的數大於0.3。
那好,既然0.1不等於0.1了,那為什麼我在控制臺上輸出console.log(0.1)還等於0.1呢?
因為在輸入內容進行轉換的時候,二進位轉換成十進位,然後十進位轉換成字元串,在這個轉換的過程中發生了取近似值,所以列印出來的是一個近似值。
//可以通過原生的取近似值(四捨五入)的方法解決就可以了。
parseFloat((0.1 + 0.2).toFixed(10))
待補充。。。
參考文章:https://juejin.im/post/5d9e932ff265da5bb065db1f