第一次去面試,面試官問我0.1 + 0,2 __ 0.3?估計不少人都知道在 JS 中0.1 + 0.2 != 0.3 的,至於大於仍是小於還真沒弄明白。前端
像這種變態的問題,在 JS 中存在不少,那小鹿就乾脆整理成了一系列,但願對你的 JS 基礎進一步加牢,也但願你能在面試中順利拿到 offer。面試
一、學習困惑算法
我先談談我本身以前在方面遇到的困惑,學習 JS 不少基礎的知識起初不是那麼順利的,尤爲是剛接觸 JS 的時候,由於 JS 歷史遺留了一些 bug,再加上它是弱類型語言,不像其它面向對象強類型語言不少概念同樣清晰。編程
二、學習建議bash
不建議在剛接觸就深刻學習,不少知識知道這麼回事就能夠,好比null爲何經過 typeof 檢測爲對象類型,一開始你只知道他經過 typeof 檢測爲對象類型就能夠。何時去理解這些知識點的原理?網絡
若是你以爲本身很懶,那就先不要去學習了,若是你對它的原理感興趣,天然而然你就學會探索了。可是,到了面試的時候,當面試官問到你這塊問題的時候,會遞歸式的問你了,到時候,你不得不去學原理了,這是你會發現,這些原理性的東西零散,這我的說東,那我的說西,而後我就根據優質的文章本身學習了下,整理成了一系列。數據結構
JS 的基本類型分爲兩大類型,分別爲原始類型和對象類型。函數
原始類型包括哪些?對象類型包括哪些?爲何要這樣分類?他們的區別又是什麼?性能
原始類型存儲的都是值,而對象類型存儲的都是地址。以下圖:學習
如上圖所示,咱們清楚了原始類型和對象類型最根本的區別,那麼問題又來了,當咱們進行變量之間賦值的時候,原始類型直接賦值的是值,而對象類型賦值的是地址。
因此,當咱們將對象做爲參數進行傳遞的時候,在函數內改變的是該地址指向的對象,而傳遞的參數是原始類型,則改變的是一個副本(複製的另外一個值)。也就是說,若是是對象,則改變了原始的值,而不能改變原始類型原始的值。
原始類型共六種,分別爲String、Number、Boolean、null、undefined、symbol
。
接下來對這六種原始類型中存在的問題咱們逐一解決。
對於null有一個歷史存留的 bug,null是對象類型嗎?雖然咱們使用 typeof 檢測null是對象類型,這實際上是一個 bug。
2.1 緣由是什麼?
由於 JS 最初的版本是 32 位系統的,爲了將性能將用低位存儲變量類型信息,000 開頭表示表明的是對象,此時null表示全零,因此係統就錯誤的將null判斷爲對象類型。雖然 JS 內部判斷代碼已經更改,可是這個 bug 一直留存下來。
2.2 null 出現的狀況彙總
一、手動設置變量的值或者對象某一個屬性值爲null(此時不賦值,後邊會賦值)。
二、在 JS 的 DOM 元素獲取中,若是沒有獲取到指定的元素對象,結果通常都是null。
三、Object.prototype._proto_的值也是null。
四、正則捕獲的時候,若是沒有獲取到結果,默認的也是null。
有關symbol使用的比較少,可是它的存在是有緣由的。
3.1 symbol 是什麼?
symbol表示獨一無二的值,由於因爲對象的屬性都是字符串類型,咱們避免不了相同字符串衝突的問題。因此爲了防止對象的屬性都是字符串類型而衝突引入的。
3.2 symbol 的使用
// 一般參數是字符串類型,若是爲對象類型,就會調用 toString 方法
let s1 = Symbol(參數);// 這個參數能夠認爲是 Symbol 實例的一個描述,用於區分
// 第一種寫法
let a = {};
a[s1] = 'Hello!';
// 第二種寫法
let a = {
[s1] = 'Hello';
}
複製代碼
4.1 undefined 出現的狀況?
一、變量提高: 只聲明未定義默認值就是undefined。
二、嚴格模式下:沒有明確的執行主體,this就是undefined。
三、對象沒有這個屬性名,屬性值是undefined。
四、函數定義形參不傳值,默認就是undefined。
五、函數沒有返回值(沒有return或者return;),默認返回的就是 undefined。
上邊咱們講了一些有關數據類型的坑,咱們回過頭來,0.1 + 0.2 __ 0.3呢?爲何會出現不相等的狀況呢?面試該如何回答面試官?
5.1 是什麼致使了這種狀況?
緣由很簡單,JS 採用的是雙精度版本,這個版本就存在精度問題,就致使了上邊這種狀況。
5.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呢?
由於在輸入內容進行轉換的時候,二進制轉換成十進制,而後十進制轉換成字符串,在這個轉換的過程當中發生了取近似值,因此打印出來的是一個近似值。
若是你把上邊的原理和麪試官一說,臥槽,面試官不給你 offer 都難,哈哈,開個玩笑,拿到 offer 不只靠基礎,也要靠你的其餘綜合能力。
今天咱們主要總結了一下有關 JS 基礎的知識點,雖然這些知識點比較坑,也比較雜,可是經過整理清晰了不少,文章中可能講的地方有問題,能夠給小鹿指出。
這些不可是基礎,更是面試中最高頻面試官經常問到了,不一樣的公司面試官的問法也是大不相同,因此換湯不換藥,上邊總結的知識點也存在不少不足的地方,歡迎各位大佬補充。
文章都看完了,爲什麼不妨點個贊呢?嘻嘻,那就說明你很自私,你怕那麼好的文章讓別人也看到。開個小小玩笑。
其實我也很自私,我把個人一直以來堅持原創的公衆號:「小鹿動畫學編程」偷偷給你,裏邊匯聚了小鹿以動畫形式講解的數據結構與算法、網絡原理、Web 等技術文章。
做者Info:
【做者】:小鹿
【原創公衆號】小鹿動畫學編程
【簡介】:和小鹿同窗一塊兒用動畫的方式從零基礎學編程,將Web前端領域、數據結構與算法、網絡原理等通俗易懂的呈獻給小夥伴。公衆號回覆 「資料」 送一從零自學資料大禮包!
【轉載說明】:轉載請說明出處,謝謝合做!~