首先我們知道JS數據類型分為基礎類型和引用類型,接下來我們談談基礎類型和引用類型的區別:
1.es5中基礎類型包括:number,string,null,undefined,Boolean。es6新增了一種基礎類型symbol,基礎類型的存儲是存放在棧中,原因是基礎類型存儲的空間很小,存放在棧(stack)中方便查找,且不易於改變
示例:
var a = 10;
var b = a;
b = 20;
console.log(a); // 10值
2. 引用類型是指有多個值構成的對象,也就是對象類型比如:Object,Array,Function,Data等,js的引用數據類型是存儲在堆中(heap),也就是說存儲的變量處的值是一個指針(point),指向存儲對象的內存地址。存在堆中的原因是:引用值的大小會改變,所以不能放在棧中,否則會降低變量查詢的速度
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了
3. 不同的內存分配機制導致了不同的訪問機制,js中不允許直接訪問保存在堆內存中的對象,所以在訪問一個對象時,首先得到這個對象在堆內存中的地址,然后在按照這個地址去獲取對象中的值,這就是按引用訪問,基礎類型則可以直接訪問到
4. 參數傳遞的不同(實參復制給形參的過程),首先我們知道所有函數都是按值來傳遞的,傳參不同也就是內存分配不同的原因,當我們把變量賦值給參數的時候,參數的改變和變量沒有關系,當我們把引用類型傳遞給參數的時候,此時我們傳遞的是引用類型的地址,所有當參數在函數內部改變的時候,會出現修改了函數外面值的情況