大家好!
昨天的儲存容量和儲存裝置,有沒有更容易理解原始型別和物件型別的差異呢?
我們進入今天的主題吧!
記得昨天有強調一句話嗎?
原始型別和物件型別的傳遞方式不同!
沒錯,今天的主題就是這個!
至於什麼是資料的傳遞呢?舉例一下:
var a = 'str',
b = a;
a === b; // true
上方都有進行資料的傳遞。
也就是說,只要有出現資料,就會有傳遞的行為。
然而,不同的資料型別也有不同的傳遞方式,舉例一下:
('s' + 't' + 'r') === 'str'; // true
new String('s' + 't' + 'r') === new String('str'); // false
接下來我們就來理解傳遞方式的差異吧!
JavaScript 只有原始型別和物件型別,因此也就只有 2 種不同的傳遞方式。
昨天我們提到:
前者(原始型別)建立的會是純值,後者(物件型別)建立的則是物件。
既然原始型別是純值,那麼也就只能傳遞純值;同理,物件型別就是傳遞物件。
var c = 5,
d = c;
c === d; // true
c = c ** 2; // 25
c; // 25
d; // 5
c === d; // false
c
和 d
傳遞的只有純值,因此 d = c
實際上就是 d = 5
。
這也是為什麼,當 c
被平方時,d
沒有被影響的原因。
var e = [],
f = e;
e === f; // true
e.push(0); // 1
e; // [0]
f; // [0]
e === f; // true
e
和 f
傳遞的就是物件,因此 f
會指向 e
在記憶體中的位置。換句話說,f
實際上就是 e
。
這也是為什麼,當 e
推入 0
時,f
也會有 0
的原因。
有一次我不小心用迴圈無限宣告變數,導致記憶體近乎直線上升,最後只好無奈地將電腦強制關機。
但是,因為這次慘痛的經驗,也就理解了原理,畢竟如果每次 f = e
都是再建立一個新的物件,那麼現在的瀏覽器可能就不會有分頁的功能了。
差不多也到尾聲了。
如果對文章有任何疑問,歡迎於下方提問和建議!
我是 Felix,我們明天再見!