1,首先谈一下js的数据类型大致分为两大块:
- 基本数据类型
string、number 、boolean
- 复杂数据类型
object、array
2,而浅拷贝和深拷贝只针对这类复杂数据的类型
- 说到浅拷贝想到:
Object.assign(目标对象,拷贝对象1,...,拷贝对象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
//可见copy2中子对象没有拷贝下来。这就叫 浅拷贝。
- 说到深拷贝想到:
jQuery中的$.extend("boolean",目标对象,拷贝对象1,...,拷贝对象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" }}
可见copy1 和copy2 中所有属性值(包括子对象的属性值)都拷贝了下来,这就是深拷贝。
3,不知道为什么总觉得call、apply 和浅拷贝、深拷贝有点关系。那就研究一下
用法:a.call(b,1,2) a.apply(b,[1,2]) 理解:把a对象身上的属性和方法冒充到b对象身上。 作用:用来动态改变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)"
·区别: 传参方式不同
1,call是连续传参
2,apply是数组传参