1,首先談一下js的數(shù)據(jù)類型大致分為兩大塊:
- 基本數(shù)據(jù)類型
string、number 、boolean
- 復(fù)雜數(shù)據(jù)類型
object、array
2,而淺拷貝和深拷貝只針對(duì)這類復(fù)雜數(shù)據(jù)的類型
- 說(shuō)到淺拷貝想到:
Object.assign(目標(biāo)對(duì)象,拷貝對(duì)象1,...,拷貝對(duì)象n)
例:
var target= {x: 3, y: 2, z: 1};
var copy1 = {a: 1, b: 2, c: {cc: "x", bb: "y", aa: "z", dd: "dd"}};
var copy2 = {a: 2, b: 3, c: {cc: "aa", bb: "bb", aa: "cc"}};
var result = Object.assign(sum, copy1, copy2);
console.log(target) // {x: 3, y: 2, z: 1, a: 2, b: 3, c:{ aa: "cc",bb: "bb", cc: "aa" }}
target===result //true
//可見(jiàn)copy2中子對(duì)象沒(méi)有拷貝下來(lái)。這就叫 淺拷貝。
- 說(shuō)到深拷貝想到:
jQuery中的$.extend("boolean",目標(biāo)對(duì)象,拷貝對(duì)象1,...,拷貝對(duì)象n);
>>為true:深拷貝
例子:
var target= {x: 3, y: 2, z: 1};
var copy1 = {a: 1, b: 2, c: {cc: "x", bb: "y", aa: "z", dd: "dd"}};
var copy2 = {a: 2, b: 3, c: {cc: "aa", bb: "bb", aa: "cc"}};
var result = $.extend(sum, copy1, copy2);
console.log(target) // {x: 3, y: 2, z: 1, a: 2, b: 3, c:{ aa: "cc",bb: "bb", cc: "aa",dd: "dd" }}
可見(jiàn)copy1 和copy2 中所有屬性值(包括子對(duì)象的屬性值)都拷貝了下來(lái),這就是深拷貝。
3,不知道為什么總覺(jué)得call、apply 和淺拷貝、深拷貝有點(diǎn)關(guān)系。那就研究一下
用法:a.call(b,1,2) a.apply(b,[1,2]) 理解:把a(bǔ)對(duì)象身上的屬性和方法冒充到b對(duì)象身上。 作用:用來(lái)動(dòng)態(tài)改變this的指向。
例子:
function add(a, b){
console.dir(this);
}
function sub(a, b){
console.dir(this);
}
add(1,2); // "Window"
sub(1,2); //"Window"
add.call(sub, 1, 2); // "sub(a, b)"
sub.apply(add, [1, 2]); // "add(a, b)"
·區(qū)別: 傳參方式不同
1,call是連續(xù)傳參
2,apply是數(shù)組傳參