掃蕩Javascript盲點(一)

又好久沒更新了,實在是慚愧

不更新不是說我懶,主要有一下幾個原因

1,時間上確實沒有多少空餘了,對我來說寫一篇技術類的文章最少也得兩個小時的樣子

2,不想胡亂更新,不想為了更新而更新,我想確保每個文章的質量,確保大家在讀的時候有所收穫

3,好吧,自己確實還是有點懶

接下來更新的掃蕩Javascript盲點系列,是從基礎走起,立足以基礎,把javascript這門語言在重新捋一遍

我認為,如果大家認真看的話,肯定會受益良多。

寫這個系列的目標也是為了自己能查漏補缺,如果文章中有什麼錯誤的地方,請大家及時在下面留言糾正。

Js的數據類型

分類

分為兩大類:值類型和引入類型

值類型:string number null undefined Boolean symbol

引用類型:Object Array Function

什麼是值類型與引用類型

值類型:值類型的變量會保存在棧內存中,如果在一個函數中聲明一個值類型的變量,那麼這個變量當函數執行結束之後會自動銷燬

引用類型:引用類型的變量名會保存在棧內存中,但是變量值會存儲在堆內存中,引用類型的變量不會自動銷燬,當沒有引用變量引用它時,系統的垃圾回收機制會回收它

值類型與引用類型的區別

1,賦值的區別

值類型的賦值直接是深拷貝,如:

掃蕩Javascript盲點(一)

值類型賦值

意思就是 b=a 的時候 a的值就是複製給了b 吧修改值不會影響a

引用類型的賦值是淺拷貝如:

掃蕩Javascript盲點(一)

引用類型賦值

可以看出引用類型的變量直接賦值實際上是傳遞引用,只是淺複製

2,類型判斷的區別

值類型判斷直接可以用typeof進行判斷,如:

掃蕩Javascript盲點(一)

typeof判斷

值得注意的是我們發現null的類型既然是object(對象),這是不是有點逆天了!

其實這是瀏覽器的一個bug原因是:

不同的對象在底層都表示為二進制,在 JavaScript 中二進制前三位都為 0 的話會被判
斷為 object 類型, null 的二進制表示是全 0,自然前三位也是 0,所以執行 typeof 時會返回 object 。

這個bug是第一版Javascript留下來的。在這個版本,數值是以32字節存儲的,由標誌位(1~3個字節)和數值組成。標誌位存儲的是低位的數據。這裡有五種標誌位:

000:對象,數據是對象的應用。

1:整型,數據是31位帶符號整數。

010:雙精度類型,數據是雙精度數字。

100:字符串,數據是字符串。

110:布爾類型,數據是布爾值。

(當面試官問到你的時候是不是可以瞬間秒殺面試官!)

引用類型用instanceof來檢測,如:

掃蕩Javascript盲點(一)

instanceof

認真看這些檢測,我們會發現 函數既屬於Function又屬於Object,那這是為什麼呢?

這時候我們就要深挖下instanceof的原理了(以下文字至少要深刻理解三遍以上)

所有的引用類型(數組,對象,函數),都具備對象的特性,即可自由擴展屬性(除了null) 雖然typeof null = object

我們可以這樣看

掃蕩Javascript盲點(一)

原型鏈

fff.__proto__ === Function

Fff.__ptoto__.__proto__ === Object

實際上instanceof判斷某個對象是不是另一個對象的實例 不管層級又多深。其實我們會發現 所有的引用類型都是由Object創建出來的

掃蕩Javascript盲點(一)

原型鏈Object

引用類型判斷最終解決方案

function typeOf (param) {
 return Object.prototype.toString.call(param).match(/\s+(\w+)/)[1]
}

意思就是通過call改變原型鏈的指向,找到對應的prototype 然後再字符串話,在進行字符串的截取,得到想要的值

這裡給大家補充點關於原型,原型鏈的知識(請理解下面的話)

所有的引用類型都有__proto__屬性 隱示原型

所有的函數都有prototype屬性 顯示原型

所有的引用類型的__proto__指向 他構造函數的prototype

掃蕩Javascript盲點(一)

原型鏈的知識

需要注意的點

在ES6中,新出了一個判斷數組的方法叫isArray

那為什麼在ES6中要新加入這些方法呢, 難道說我們目前的方法有什麼漏洞嗎,大家可以自行百度,知道的也可以再下面留言,共同學習哦!

此文章已經打包成pdf版本,如有需要請私信


分享到:


相關文章: