//基本資料型別賦值
var a = 10;
var b = a;
a++ ;
console.log(a); // 11
console.log(b); // 10
//引用資料型別賦值
let a =
let b = a
b.name = '22'
console.log(a.name) // 22
console.log(b.name) // 22
注意:淺拷貝只複製一層物件的屬性
方法一:object.assign
*語法:object.assign(target, ...sources) *
es6中拷貝物件的方法,接受的第乙個引數target是拷貝後的物件,剩下的引數是要拷貝的物件sources(可以是多個)
例1:
let target = {};
let source = };
object.assign(target ,source);
console.log(target); // }
例2:
let target = {};
let source = };
object.assign(target ,source);
source.a = '22';
source.b.name = 'nana'
console.log(source); // }
console.log(target); // }
object.assign注意事項
只拷貝源物件的自身屬性(不拷貝繼承屬性)
它不會拷貝物件不可列舉的屬性
undefined
和null
無法轉成物件,它們不能作為object.assign
引數,但是可以作為源物件
屬性名為symbol
值的屬性,可以被object.assign拷貝。
方法二:array.prototype.slice
實現原陣列的淺拷貝
var a = [ 1, 3, 5, ];
var b = array.prototype.slice.call(a);
b[0] = 2;
console.log(a); // [ 1, 3, 5, ];
console.log(b); // [ 2, 3, 5, ];
// 從輸出結果可以看出,淺拷貝後,陣列a[0]並不會隨著b[0]改變而改變
// 說明a和b在棧記憶體中引用位址並不相同。
var a = [ 1, 3, 5, ];
var b = array.prototype.slice.call(a);
b[3].x = 2;
console.log(a); // [ 1, 3, 5, ];
console.log(b); // [ 1, 3, 5, ];
// 從輸出結果可以看出,淺拷貝後,陣列中物件的屬性會根據修改而改變
// 說明淺拷貝的時候拷貝的已存在物件的物件的屬性引用。
方法三:array.prototype.concat
let array = [, ];
let array1 = [,];
let array2=array.concat(array1);
array1[0].c=123;
console.log(array2);// [ , , , ]
console.log(array1);// [ , ]
方法四:...擴充套件運算子
語法:var cloneobj = ;
var a = [ 1, 3, 5, ];
var b = ;
b[0] = 2;
console.log(a); // [ 1, 3, 5, ];
console.log(b); // [ 2, 3, 5, ];
// 從輸出結果可以看出,淺拷貝後,陣列a[0]並不會隨著b[0]改變而改變
// 說明a和b在棧記憶體中引用位址並不相同。
var a = [ 1, 3, 5, ];
var b = ;
b[3].x = 2;
console.log(a); // [ 1, 3, 5, ];
console.log(b); // [ 1, 3, 5, ];
// 從輸出結果可以看出,淺拷貝後,陣列中物件的屬性會根據修改而改變
// 說明淺拷貝的時候拷貝的已存在物件的物件的屬性引用。
其他方法:
//淺拷貝實現
var obj = ;
var shallowobj = shallowcopy(obj);
function shallowcopy(src) ;
for (var prop in src)
} return dst;
}shallowobj.arr[1] = 5;
obj.arr[1] // = 5
深拷貝開闢乙個新的棧,兩個物件對應兩個不同的位址,修改乙個物件的屬性,不會改變另乙個物件的屬性注意:深拷貝對物件中的子物件進行遞迴拷貝,拷貝前後兩個物件互不影響
方法一:json.parse(json.stringify())
let arr = [1, 2, ];
let newarr = json.parse(json.stringify(arr));
newarr[2].name = 'nana';
console.log(newarr); // [ 1, 2, ]
console.log(arr); // [ 1, 2, ]
json.stringify()實現深拷貝注意點
拷貝的物件的值中如果有函式,undefined,symbol則經過json.stringify()序列化後的json字串中這個鍵值對會消失
無法拷貝不可列舉的屬性,無法拷貝物件的原型鏈
拷貝date引用型別會變成字串
拷貝regexp引用型別會變成空物件
物件中含有nan、infinity和-infinity,則序列化的結果會變成null
無法拷貝物件的迴圈應用(即obj[key] = obj)
方法二:jquery 的 $.extend
var $ = require('jquery');
var obj1 = },
c: [1, 2, 3]
};var obj2 = $.extend(true, {}, obj1);
淺拷貝和**深拷貝區別淺拷貝只複製一層物件的屬性,而深拷貝則遞迴複製了所有層級
賦值與深淺拷貝
a 1 b a a 2 print a a print b b 列印出結果 a 2 b 1 解析 當a 1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x5244...
JS賦值 淺拷貝和深拷貝
賦值 當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的 var person console.log person var person1 person p...
python賦值與深淺拷貝
參考文章 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 a 1 2,3 hello python c b a for i in range len a print id a i id b i all true print a b true這種情況下,b和a是一樣的,他們指向同...