*你們對js必定不會陌生,入門很簡單(普通入門),不少人經過網絡資源、書籍、課堂等不少途徑學習js,可是有些js基礎的只是每每被你們遺漏,本章就從js變量類型來講一說jsjavascript
js變量類型分爲基本類型(或者叫值類型)和引用類型。值類型包括Number、Boolean、String、undefined、 null、Symbol (ES6 新增)。 引用類型包括Object 、Array、Function、Date、RegExp,值類型存放在棧內存中,引用類型的數據是存放在堆內存中。java
值類型的數據在複製的時候會在棧內存中新建一個新的存儲區域用來存儲新的變量,和以前的值沒有任何關係。好比以下例子:面試
var a = 'a' var b = a b = 'b' console.log(a) // 'a'
當b的值改變的時候,a的值不會跟着改變。這個很簡單,你們也都能理解。瀏覽器
下面說一下引用類型,定義一個對象的時候會在棧內存中存儲了一個指針,該指針指向堆內存中該對象的存儲地址,當複製這個對象賦值給另外一個對象的時候,只是把該對象的指針地址賦值給了另外一個對象變量,他們都指向同一個對象,因此當一個值改變的時候,另外一個值會跟着改變,看下面的例子就會明白:網絡
var obj1 = {name:'obj1'} var obj2 = obj1 obj2.name = 'obj2' console.log(obj1.name) // 'obj2'
你們能夠執行一下上面的代碼,打印obj1.name的時候輸出'obj2',這就是由於對象是引用類型的變量。函數
js中內置了一些函數和對象,不少語言都會有內置的方法,直接能夠調用開發。
根據ECMAscript(javascript語法標準)提供的內置函數包括Object、Array、Boolean、Number、String、Function、Date、Regexp和Error。內置對象包括Math和JSON。學習
注意:javascript基礎語法提供的內置函數和方法只有這些,像Window、Navigator那是瀏覽器提供給咱們的。還有一點前面的集中都是內置函數而不是內置對象,最後的Math和JSON是內置對象,這個在咱們之後的章節講原型鏈的時候就明白了,這裏先記住就OK了。
這個問題你們應該都不陌生,在開發或者面試中會常常遇見的問題。那麼答案究竟是什麼呢?
首先看到這個問題的時候先不要去想到底那些狀況使用==那些狀況使用===,咱們應該首先去想這個問題背後涉及到那些知識點。很顯然,這裏考的就是強制類型轉換,在使用==得時候會強制類型轉換,而使用===的時候不會發生強制類型轉換。強制類型轉換你們應該都知道。下面咱們總結一下:
在if()條件判斷中0、""、NaN、null、undefined、false都會轉爲false,判斷對象的一個屬性存在可使用以下語法:指針
var obj = {} if(obj.name == null){...} // 至關於obj.name === null || obj.name === undefined /* 該方法只適用於判斷對象的屬性,不能用於直接判斷變量是否存在 */ if(someVal){...} // 這裏瀏覽器會報錯
標準答案是:只有在判斷一個對象的屬性是否存在的時候使用==,其餘都使用===。code
這裏首先想到的是對typeof和變量類型的理解,因爲typeof只能區分基本類型的變量,因此不能準確的判斷變量類型。對象
Undefined -- Undefined Boolean -- Boolean Number -- Number String -- String ---------- Object -- Object Function -- Function Array -- Object null -- Object
因此答案是typeof只能判斷值類型的變量,不能判斷引用類型的變量,要想準確判斷變量的類型,能夠在之後的原型的章節中介紹