js資料型別賦值,淺拷貝,深拷貝

2021-09-24 09:29:25 字數 2842 閱讀 8303

直接上**是我的風格基本資料型別的賦值

var a = 10;

var b = a;

b = 24;

console.log(a); // 10 a不受b的影響。

console.log(b) // 24

// 基本資料型別賦值時。。是copy乙份10的值。

// 當b=24時。a不受b的影響。

複製**

複雜資料型別的賦值

var obj = 

var obj1 = obj;

obj1.age = 18;

console.log(obj); //

console.log(obj1); //

// 複雜資料型別賦值時。。是copy乙份引用位址如0x1111。

// 當obj1 = obj;時。obj和obj1引用一樣。指向同一片堆記憶體空間。

// 所以當obj1.age = 18時。同樣也會更改obj2。

複製**

注意: 淺拷貝和深拷貝都主要針對複雜資料型別

淺拷貝:淺拷貝只複製指向某個物件的指標,而不複製物件本身,新舊物件還是共享同一塊記憶體。

深拷貝:但深拷貝會另外創造乙個一模一樣的物件,新物件跟原物件不共享記憶體,修改新物件不會改到原物件。

淺拷貝

// 直接上**吧

function

shallowcopy(oldobj) ;

for(var prop in oldobj)

}return newobj;

}// 淺拷貝

var obj1 =

var obj2 = shallowcopy(obj1);

obj2.a = 18;

obj2.b = ['二', '三', '四'];

obj2.c[0] = ['五', '六'];

console.log('obj1===',obj1)

console.log('obj2===',obj2)

// 如果物件只有一層。。深拷貝 和 淺拷貝一樣。

複製**

賦值

// 賦值

var obj1 =

var obj3 = obj1;

obj3.a = 18;

obj3.b = ['二', '三', '四'];

obj3.c[0] = ['五', '六'];

console.log('obj1===',obj1)

console.log('obj3===',obj3)

// 共享一片記憶體。所有值都會改變。

複製**

自己封裝

function

shallowcopy(oldobj) ;

for(var prop in oldobj)

}return newobj;

}複製**

使用object.assign()

var pj =  };

var pj1 = object.assign({}, obj);

pj1.a.a = "wade";

console.log(pj.a.a); //wade

複製**

注意:當object只有一層的時候,是深拷貝

var pj =  };

var pj1 = object.assign({}, obj);

pj1.a.a = "wade";

console.log(pj.a.a); //wade

複製**

陣列的淺拷貝

// 第一種

let arr = [1, 3, ];

let arr2=arr.concat();

arr2[2].username = '君';

console.log(arr[2].username); // 君

// 第二種

let arr = [1, 3, ];

let arr3 = arr.slice();

arr3[2].username = '君';

console.log(arr[2].username); // 君

// 一般很少用到陣列的拷貝。

// 陣列淺拷貝和物件是一樣的

複製**

原陣列的元素會按照下述規則拷貝:

json.parse(json.stringify())

var pj =  

};var deeppj = json.parse(json.stringify(pj)); // 。。這種方式弊端在於無法拷貝方法。

複製**

自覺手動封裝了

function

deepcopy(oldobj) ;

}else

if(oldobjtype === 'array')else

for(let prop in oldobj) else

}return newobj;

}複製**

借用第三方庫 函式庫lodash

var _ = require('lodash');

var obj1 = },

c: [1, 2, 3]

};var obj2 = _.clonedeep(obj1);

console.log(obj1.b.f === obj2.b.f); // false

複製**

JS賦值 淺拷貝和深拷貝

賦值 當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的 var person console.log person var person1 person p...

淺拷貝 深拷貝和淺賦值 深賦值

include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...

深拷貝 淺拷貝 資料型別

1 不可變型別 包括數值 字串 元組 不可變指的是不能改變引用,只能放置乙個新的引用 2 可變型別 包括列表和字典 可變指的是當向列表或字典裡面增刪改時,引用沒有受到影響 進一步解釋可變與不可變,是指記憶體中的那塊內容 value 是否可以被改變。如果是不可變型別,在對物件本身操作的時候,必須在記憶...