日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

保存数组类型数据_JS基本数据类型和引用数据类型的区别及深浅拷贝

發布時間:2025/4/16 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 保存数组类型数据_JS基本数据类型和引用数据类型的区别及深浅拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、棧(stack)和堆(heap)

stack為自動分配的內存空間,它由系統自動釋放;而heap則是動態分配的內存,大小也不一定會自動釋放

2、數據類型

JS分兩種數據類型:

基本數據類型Number、String、Boolean、Null、 Undefined、Symbol(ES6),這些類型可以直接操作保存在變量中的實際值。

引用數據類型Object(在JS中除了基本數據類型以外的都是對象,數據是對象,函數是對象,正則表達式是對象)

3、基本數據類型(存放在棧中)

基本數據類型是指存放在中的簡單數據段,數據大小確定,內存空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問

var a = 10;

var b = a;

b = 20;

console.log(a); // 10值

console.log(b); // 20值

下圖演示了這種基本數據類型賦值的過程:

4、引用數據類型(存放在堆內存中的對象,每個空間大小不一樣,要根據情況進行特定的配置)

引用類型是存放在堆內存中的對象,變量其實是保存的在棧內存中的一個指針(保存的是堆內存中的引用地址),這個指針指向堆內存。

引用類型數據在棧內存中保存的實際上是對象在堆內存中的引用地址。通過這個引用地址可以快速查找到保存中堆內存中的對象

var obj1 = new Object();var obj2 = obj1;obj2.name = "我有名字了";console.log(obj1.name); // 我有名字了

說明這兩個引用數據類型指向了同一個堆內存對象。obj1賦值給obj2,實際上這個堆內存對象在棧內存的引用地址復制了一份給了obj2,但是實際上他們共同指向了同一個堆內存對象,所以修改obj2其實就是修改那個對象,所以通過obj1訪問也能訪問的到。

var a = [1,2,3,4,5];

var b = a;//傳址 ,對象中傳給變量的數據是引用類型的,會存儲在堆中;

var c = a[0];//傳值,把對象中的屬性/數組中的數組項賦值給變量,這時變量C是基本數據類型,存儲在棧內存中;改變棧中的數據不會影響堆中的數據

alert(b);//1,2,3,4,5

alert(c);//1

//改變數值

b[4] = 6;

c = 7;

alert(a[4]);//6

alert(a[0]);//1

從上面我們可以得知,當我改變b中的數據時,a中數據也發生了變化;但是當我改變c的數據值時,a卻沒有發生改變。

這就是傳值與傳址的區別。因為a是數組,屬于引用類型,所以它賦予給b的時候傳的是棧中的地址(相當于新建了一個不同名“指針”),而不是堆內存中的對象。而c僅僅是從a堆內存中獲取的一個數據值,并保存在棧中。所以b修改的時候,會根據地址回到a堆中修改,c則直接在棧中修改,并且不能指向a堆內存中。

5、淺拷貝

前面已經提到,在定義一個對象或數組時,變量存放的往往只是一個地址。當我們使用對象拷貝時,如果屬性是對象或數組時,這時候我們傳遞的也只是一個地址。因此子對象在訪問該屬性時,會根據地址回溯到父對象指向的堆內存中,即父子對象發生了關聯,兩者的屬性值會指向同一內存空間。

var a={key1:"11111"}function Copy(p){ var c ={}; for (var i in p){ c[i]=p[i] } return c;}a.key2 = ["小輝

總結

以上是生活随笔為你收集整理的保存数组类型数据_JS基本数据类型和引用数据类型的区别及深浅拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。