JS浅拷贝和深拷贝
// 先创建一个对象
var person = {
name : ' 张三 ',
age : ' 18 ',
children : {
first : {
name : ' 张小三 ',
age : ' 5 ',
}
second : {
name : ' 张小四 ',
age : ' 6 '
}
}
car : [ ' 奔驰 ' , ' 宝马 ']
}
================================================================================================================================================
// 浅拷贝
function clone ( origin , target ){
var target = target || { } // 判断target 有没有传值 没有的话给一个空对象
for ( var key in origin ){
target[key] = origin[key];
}
return target
}
// 前拷贝会带来的问题 比如 对象中的属性 还有对象 则拷贝出来的该属性还是一个引用了跟被拷贝的对象的地址值;该属性发生变化时,原被拷贝的对象也会跟着发生变化。
=================================================================================================================================================
// 深拷贝
function deepClone ( origin , target ) {
var target = target || { }
var toStr = Object.prototype.toString, // 转化为字符串的方法
var arrType = '[object Array]' // 通过转化为字符串 如果是数组 则返回该值。用于判断是不是数组。
for ( var key in origin ){
if (origin.hasOwnProperty(key)){ // hasOwnProperty 剔除自身以外的属性
if ( typeof(origin[key]) === 'object' && origin[key] !== null){ // 因为null 也是对象类型 也要把null排除
if( toStr.call( origin[key] ) === arrType ){
target[key] = [] // 判断origin 当前属性是数组还是对象 是数组 给target 定义一个数组
} else{
target[key] = {}
}
deepClone(origin[key] , target[key] ) // 进行递归
}else{
target[key] = origin[key]
}
}
}
return target
}

浙公网安备 33010602011771号