基本知识
- javascript变量包含两种不同数据类型的值:基本类型和引用类型。
- 基本类型值指的是简单的数据段:
number、string、boolean、null、undefined、symbol - 引用类型值指那些可能由多个值构成的对象:
object
浅拷贝与深拷贝的区别
- 浅拷贝只能拷贝一层,深拷贝可以拷贝全部
- 拷贝的主要目标是复制值(number、string、boolean、null、undefined、symbol),而不是地址(object)
浅拷贝
- 数组浅拷贝
//copy一个全新的数组
var a1 = [12,45,47,56,213,4654,154];
var a2 = Array.from(a1);
//slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
var a1 = [12,45,47,56,213,4654,154];
var a2 = a1.slice(0);
- 对象浅拷贝 Object.assign({},source)
var x = {
a: 1,
b: { f: { g: 1 } },
c: [ 1, 2, 3 ]
};
var y = Object.assign({}, x);
深拷贝
- 通过递归解析解决
var testObj = {
a: 1,
b: {
name:'zhangsan'
},
c: [1,2,3]
};
function deepClone(tar){
//非对象或者null直接返回
if(typeof tar != 'object' || tar == null){
return tar;
};
var result;
if(tar instanceof Array ){
result = [];
}else{
result = {};
};
for(var attr in tar){
//忽略掉那些从原型链上继承到的属性
if(tar.hasOwnProperty(attr)){
result[attr] = deepClone(tar[attr]);
};
}
return result;
}
var obj2 = deepClone(testObj);
obj2.c[1] = 2222;
console.log(testObj);
console.log(obj2);
- 通过JSON解析解决 JSON.parse(JSON.stringify(source))
var x = {
a: 1,
b: { f: { g: 1 } },
c: [ 1, 2, 3 ]
};
var y = JSON.parse(JSON.stringify(x));
未完待续...
网友评论