JS分兩種數(shù)據(jù)類型:
(1)基本數(shù)據(jù)類型:Number昂验、String、Boolean轰胁、Null、 Undefined完域、Symbol(ES6)软吐,這些類型可以直接操作保存在變量中的實際值。
(2)引用數(shù)據(jù)類型:Object(在JS中除了基本數(shù)據(jù)類型以外的都是對象吟税,數(shù)據(jù)是對象凹耙,函數(shù)是對象,正則表達(dá)式是對象)
基本數(shù)據(jù)類型(存放在棧中)
基本數(shù)據(jù)類型是指存放在棧中的簡單數(shù)據(jù)段肠仪,數(shù)據(jù)大小確定肖抱,內(nèi)存空間大小可以分配,它們是直接按值存放的异旧,所以可以直接按值訪問意述,如下例子
var a = 10;
var b = a;
b = 20;
console.log(a); // 10值
console.log(b); // 20值
下圖演示了這種基本數(shù)據(jù)類型賦值的過程:
引用數(shù)據(jù)類型(存放在堆內(nèi)存中的對象,每個空間大小不一樣吮蛹,要根據(jù)情況進(jìn)行特定的配置)
引用類型是存放在堆內(nèi)存中的對象荤崇,變量其實是保存的在棧內(nèi)存中的一個指針(保存的是堆內(nèi)存中的引用地址),這個指針指向堆內(nèi)存潮针。換言之术荤,引用類型數(shù)據(jù)在棧內(nèi)存中保存的實際上是對象在堆內(nèi)存中的引用地址。通過這個引用地址可以快速查找到保存中堆內(nèi)存中的對象每篷,如下例子
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了
下圖演示了這種引用數(shù)據(jù)類型賦值的過程:
再看個結(jié)合的例子:
var a = [1, 2, 3, 4, 5];
var b = a;//傳值
var c = a[0];
console.log(b)
console.log(c)
b[4]=6;
c=7;
console.log(a[4])
console.log(a[0])
console.log(c)
從上面我們可以得知瓣戚,當(dāng)我改變b中的數(shù)據(jù)時端圈,a中數(shù)據(jù)也發(fā)生了變化;但是當(dāng)我改變c的數(shù)據(jù)值時子库,a卻沒有發(fā)生改變舱权。
這就是傳值與傳址的區(qū)別。因為a是數(shù)組仑嗅,屬于引用類型宴倍,所以它賦予給b的時候傳的是棧中的地址(相當(dāng)于新建了一個不同名“指針”),而不是堆內(nèi)存中的對象无畔。而c僅僅是從a堆內(nèi)存中獲取的一個數(shù)據(jù)值啊楚,并保存在棧中吠冤。所以b修改的時候浑彰,會根據(jù)地址回到a堆中修改,c則直接在棧中修改拯辙,并且不能指向a堆內(nèi)存中郭变。
所以衍生出來的另一個值得探討的問題“深淺拷貝”:
詳細(xì)請參考博客:http://www.reibang.com/p/3e7a628a276c
本文參考博客:
https://www.cnblogs.com/c2016c/articles/9328725.html