JS基礎知識點——原始類型和對象類型的區別

js類型

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;
}
複製代碼

總結

原始類型和對象類型的區別,總結起來就是:

類型 原始類型 對象類型
不可改變 能夠改變
屬性和方法 不能添加 能添加
存儲值 地址(指針)
比較 值的比較 地址的比較
相關文章
相關標籤/搜索