1.js的數(shù)據(jù)類型分為基本類型(Undefined,Null,Boolean,Number、String)和引用類型(Array, Oject, function....Date ,RegExp)
typeOf(null)->obj
2.基本類型:不論是變量名還是原始值都在棧中。
當(dāng)把一個原始變量傳遞給另一個原始變量時,是把一個棧房間的東西復(fù)制到另一個棧房間,且這兩個原始變量互不影響。
3.引用類型:變量名在棧中,數(shù)值在堆中,他們中間通過指針進行連接。
當(dāng)把引用對象傳遞給另一個變量時,復(fù)制的其實是指向?qū)嶋H對象的指針, 此時 兩者指向的 是同一個數(shù)據(jù),若通過方法改變其中一個變量的值,則訪問另一個變量時,其值也會隨之加以改變;但若不是通過方法 而是通過 重新賦值 此時 相當(dāng)于 重新開了一個房間 該值的原指針改變 ,則另外一個 值 不會隨他的改變而改變。
eg:
var a="hello";
var b=a;
a="world";
alert(a);//world
alert(b);//hello
var arr=[1,3];
arr1=arr;
arr.push(5);
alert(arr)//1,3,5
alert(arr1);//1,3,5
arr=[7,8];
alert(arr);//7,8
alert(arr1);//1,3,5
var a = [1,2,3]
var b = a
b[0] = 5
a->[5,2,3]
b->[5,2,3]

1553568964681.jpg
這里可以這樣理解,如果是重新負(fù)值的話,引用類型都是又開辟了一個新的房間,那就有了新的內(nèi)存地址,但是如果使用了push,pop方法,或者只是在原來數(shù)據(jù)的基礎(chǔ)上更改的都不會開辟新的房間