JavaScript数据的值复制

ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型。

基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。

JavaScript中基本数据类型的赋值和函数传参是值传递,而引用数据类型的赋值和函数传参是引用传递。

// 实现一个函数clone,对JavaScript中的主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。

function clone ( obj ) {
let copy ;
switch ( typeof obj ) {
case "undefined" :
break ;
case "number" :
copy = obj - 0 ;
break ;
case "string" :
copy = obj + "" ;
break ;
case "boolean" :
copy = obj ;
break ;
case "object" : // object分为三种情况 (null),对象(Object)和数组(Array)
if ( obj === null ) { // null类型被看做空对象指针,即空的对象引用。只有一个值,即null值,
                        所以,在用typeof 操作符去检测null类型的值时,结果是object类型。
copy = null ;
} else {
                // 通过对象的原型判断传入参数是否为数组
if ( Object . prototype . toString . call ( obj ). slice ( 8 , - 1 ) === "Array" ) {
// String.slice(start,end) start参数为截取开始位置,end参数为结束位置
copy = [];
for ( var i = 0 ; i < obj . length ; i ++ ) {
copy . push ( clone ( obj [ i ]));
}
} else if ( Object . prototype . toString . call ( obj ). slice ( 8 , - 1 ) === "Object" ){
// 如果对象的原型是Object进行对象遍历
copy = {};
for ( var j in obj ) {
copy [ j ] = clone ( obj [ j ]);
}
} else {
// [object Date],[object RegExp],[object Function] 不做处理
copy = Object . prototype . toString . call ( obj );
}
}
break ;
default :
copy = obj ;
break ;
}
return copy ;
}


数组对象的深拷贝:

var clone = function (v) {
   var o = v.constructor === Array ? [] : {};
   for ( var i in v) {
     o[i] = typeof v[i] === "Object" ? clone(v[i]) : v[i];
   }
   return o;
}

猜你喜欢

转载自blog.csdn.net/weixin_41632399/article/details/80168028