Js基礎知識(一) – 變數

zhuqitao發表於2019-02-16

js基礎 – 變數

*大家對js一定不會陌生,入門很簡單(普通入門),很多人通過網路資源、書籍、課堂等很多途徑學習js,但是有些js基礎的只是往往被大家遺漏,本章就從js變數型別來說一說js

變數型別*

js變數型別分為基本型別(或者叫值型別)和引用型別。值型別包括Number、Boolean、String、undefined、 null、Symbol (ES6 新增)。 引用型別包括Object 、Array、Function、Date、RegExp,值型別存放在棧記憶體中,引用型別的資料是存放在堆記憶體中。

值型別的資料在複製的時候會在棧記憶體中新建一個新的儲存區域用來儲存新的變數,和之前的值沒有任何關係。比如如下例子:

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`,這就是因為物件是引用型別的變數。

JavaScript內建函式和物件

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){...} // 這裡瀏覽器會報錯

標準答案是:只有在判斷一個物件的屬性是否存在的時候使用==,其他都使用===。

typeof能否準確判斷變數型別

這裡首先想到的是對typeof和變數型別的理解,由於typeof只能區分基本型別的變數,所以不能準確的判斷變數型別。

Undefined  -- Undefined  
Boolean    -- Boolean
Number     -- Number     
String     -- String


----------
Object     -- Object
Function   -- Function
Array      -- Object
null       -- Object

所以答案是typeof只能判斷值型別的變數,不能判斷引用型別的變數,要想準確判斷變數的型別,可以在以後的原型的章節中介紹

相關文章