JavaScript中的數(shù)據(jù)類型一共有7中,分別是Number,Boolean,String,Null,Undefined,Symbol和Object?;緮?shù)據(jù)類型包含Number,Boolean,String,Null,Undefined以及Symbol。
基本數(shù)據(jù)類型與對象數(shù)據(jù)類型(Object)的區(qū)別在哪里呢?
- 首先,基本數(shù)據(jù)類型的值不可改變,對象數(shù)據(jù)類型的值可以改變
其實當時看完這句話,我的內(nèi)心是拒絕的,因為你看:
let number = 111;
number = 222;
console.log(number);
輸出不就是222嗎?
其實這樣改變的并不是基本數(shù)據(jù)類型的值,而是一個變量的值。在存儲區(qū)域中,111和222的地址是不會變的。
- 其次,基本數(shù)據(jù)類型存儲的是值,而對象數(shù)據(jù)類型存儲的是指針
什么是指針(地址),嗯……對于學習過C/C++的人應(yīng)該知道,有靜態(tài)存儲區(qū)和動態(tài)存儲區(qū),對于基本數(shù)據(jù)類型,它們都是存儲在靜態(tài)存儲區(qū)的,它們有固定的地址,例如字符'a'在內(nèi)存中就有固定的地址。而對于對象數(shù)據(jù)類型,它們存儲的是指針,指針的作用就是存儲你所想要訪問數(shù)據(jù)的地址,畫圖來說大概就是這樣:
http://ww1.sinaimg.cn/large/005Vjb0Sly1g9qqdp4xpzj30vf08xt8m.jpg)
所以,當我們對基本數(shù)據(jù)類型進行操作時:
let a=1;
let b = a;
b = 2;
console.log(a);
輸出的a還是1,因為它不會因為b的值發(fā)生變化而受到影響。
如果是對象數(shù)據(jù)類型:
let c = [];
let d = c;
d.push(1);
console.log(c);
輸出的結(jié)果就是[1]。
- 再次,基本數(shù)據(jù)類型的比較是值的比較,對象數(shù)據(jù)類型的比較是地址的比較。
這個有了上面的例子,就比較好理解。因為對象是以地址來訪問的,所以當我們比較的時候,其實比較的是內(nèi)部的地址是否相同,而對于基本數(shù)據(jù)類型的比較,則是對于值是否相同來比較的。
總結(jié)一下,可以得出下表結(jié)論:
| 類型 | 基本數(shù)據(jù)類型 | 對象數(shù)據(jù)類型 |
|---|---|---|
| 值 | 無法改變 | 可以改變 |
| 屬性和方法 | 無法添加 | 可以添加 |
| 存儲值 | 值 | 指針(地址) |
| 比較 | 值的比較 | 地址的比較 |