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;
}

posted @ 2018-05-02 19:39  _陈十一  阅读(463)  评论(0编辑  收藏  举报