JavaScript語言規定了7種語言類型,他們分別是:es6
1.Number(數字)
2.Boolean(布爾值)
3.String(字符串)
4.Null (空)
5.Undefined (未定義)
6.Symbol (es6新增,表示獨一無二的值)
7.Object(對象)bash
其中,除了Object是對象類型,其餘的都是原始(基本)類型。下面咱們來總結一下基本(原始)數據類型和對象數據類型的區別函數
1.基本數據類型的值不可改變,對象數據類型的值能夠改變
任何方法都沒法改變基本數據類型的值,好比:ui
let name = 'wanglin';
name.slice(0,2) // wa
console.log(name); // wanglin
name.toUpperCase(); // WANGLIN
console.log(name); // wanglin
複製代碼
在上例中咱們定義了一個變量name並將一個字符串類型的值"wanglin"賦值給了name,能夠看到,調用slice方法和toUpperCase方法時,返回的是一個新的字符串,跟原來的變量name沒有關係,而name的值始終沒有改變。那麼下面這種狀況呢?spa
let name = 'wanglin';
name = 'wanglin1'
console.log(name); // wanglin1
複製代碼
看到這裏,可能有些讀者會認爲,name的值不是改變了嗎?但其實並非這樣的,這裏的name只是一個指針,你所理解的改變只是name指針的指向從wanglin改成了wanglin1,但真正的值wanglin和wanglin1是不會改變的。咱們說的基礎類型的值不會改變,是指wanglin或wanglin1不變,而不是name不變。指針
對象類型的值能夠改變,好比:code
let person = {
name:'wanglin'
}
person.name = 'wangmumu'; // 改變對象的屬性值
person.age = 22; // 新增一個屬性
console.log(person); // {name: "wangmumu", age: 22}
複製代碼
2.基本數據類型存儲的是值,對象數據類型存儲的是地址(指針)對象
咱們先來看一個例子ip
let a = 1;
let b = a;
b = 2;
console.log(a); // 1,a的值不會因b的值的改變而受到影響
let c = [];
let d = c;
d.push(1);
console.log(c) // [1],c的值因d的值的改變而受到影響了
複製代碼
能夠看到,當咱們將一個值賦值給另外一個變量時,若是是基本類型,則這個變量不會因另外一個變量值的變化而受影響。但若是是對象類型,則會受到影響。其根本緣由是,基本數據類型存儲的是值,對象數據類型存儲的是地址。開發
假設上例中的c的地址是#001,當咱們將c賦值給d時,實際上是把c的地址,也就是#001賦值給了d,這時d的地址和c同樣都是#001,改變d的同時,c也會受到影響了。
若是咱們實際開發中不想受到這個問題的困擾,可使用淺拷貝來解決這個問題。固然,一旦提到淺拷貝,就會發現淺拷貝的各類問題,這時就要考慮使用深拷貝了。
3.基本數據類型的比較是值的比較,對象數據類型的比較是地址的比較
例如:
let a = 1,b = 1;
console.log( a == b ); // true
let c = [],d = [];
console.log( c == d ); // false
複製代碼
能夠看到,若是是對象類型,即便是徹底相同的值,比較的時候也是false,是由於他們的地址是不一樣的。由此咱們引起出一個思考,若是想比較兩個對象類型的值是否相同,咱們該怎麼辦呢?
這裏提出一種思路解決,就是封裝一個函數來判斷兩個對象的值是否相等,函數的參數就是這兩個對象自己,在函數裏把這兩個對象的值遍歷用來逐一比較。
function isObjEqual(o1,o2){
let props1 = Object.getOwnPropertyNames(o1);
let props2 = Object.getOwnPropertyNames(o2);
if (props1.length != props2.length) {
return false;
}
for (let i = 0,max = props1.length; i < max; i++) {
let propName = props1[i];
if (o1[propName] !== o2[propName]) {
return false;
}
}
return true;
}
複製代碼
原始類型和對象類型的區別,總結起來就是:
類型 | 原始類型 | 對象類型 |
---|---|---|
值 | 不可改變 | 能夠改變 |
屬性和方法 | 不能添加 | 能添加 |
存儲值 | 值 | 地址(指針) |
比較 | 值的比較 | 地址的比較 |