二:深浅拷贝对象:对象
- 浅拷贝:拷贝的是栈中的地址,所以当修改其中的一个,另一个也会修改
- 深拷贝:拷贝的值一样,但是指向的地址不一样。所以当修改其中一个并不影响另外一个
三:深拷贝代码
方法一:
- JSON对象的属性要加双引号
- 没有末尾的分号
//对象字面量
var obj = {
name:'a'
};
//
JSON对象
var obj = {
“name”:'a'
}
- JSON.stringify(对象):将javascript对象转成JSON字符串
var obj = {
name:'a',
arr:[1,2],
age:{
girl:17
}
}
var b = JSON.stringify(obj);//{"name":"a","arr":[1,2],"age":{"girl":17}}
console.log(typeof b);//string
- JSON.parse(JSON字符串):将JSON字符串转成JS对象
var d = '{"b":"1"}'
console.log(JSON.parse(d));//{ b: "1" }
console.log(Object.prototype.toString.call({}));//[object Object]
var obj1 = {
name:'j',
age:18
};
var arr2 = JSON.parse(JSON.stringify(obj1));
arr2.name = 's';
console.log(arr2);//{ name: "s", age: 18 }
方法二
//步骤:
//1.遍历
//2.判断原始值还是引用值 typeof
//3.引用值,判断对象数组Object.prototype.toString.call()
//4.建立对象或数组
//5.递归
function deepClone(origin,target) {
var target = target || {},
strTo = Object.prototype.toString,
str = "[object Array]";//若是object,返回 [object Object]
for (var prop in origin){
if (origin.hasOwnProperty(prop)) { //属性是自己的不是继承过来的
if ((typeof (origin[prop]) == "object") && (origin[prop]!==null)) {
//引用值,除了null
//判断数组或者对象
if (strTo.call(origin[prop]) == str) {
target[prop] = [];
} else {
target[prop] = {};
}
deepClone(origin[prop], target[prop]);
} else {
//原始值
target[prop] = origin[prop];
}
}
}
return target;
}