要求

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

code

/** 对象克隆 
* 支持基本数据类型及对象
* 递归方法 */
function clone(obj) {
var o;
switch (typeof obj) {
case "undefined":
break;
case "string":
o = obj + "";
break;
case "number":
o = obj - 0;
break;
case "boolean":
o = obj;
break;
case "object": // object 分为两种情况 对象(Object)或数组(Array)
if (obj === null) {
o = null;
} else {
if (Object.prototype.toString.call(obj).slice(8, -1) === "Array") {
o = [];
for (var i = 0; i < obj.length; i++) {  
o.push(clone(obj[i]));
}
} else {
o = {};
for (var k in obj) {
o[k] = clone(obj[k]);
}
}
}
break;
default:
o = obj;
break;
}
return o;
}

var m1 = clone([1, 2, 3]);
var m2 = clone({ 1: '1', 'hello': 32 });
console.log(m1); //[ 1, 2, 3 ]
console.log(m2); //{ '1': '1', hello: 32 }

解析

Object.prototype.toString.call(obj).slice(8,-1) === “Array” 是什么意思?
语法:
array.slice(start, end)

参数:

  • start 可选。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
  • end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

返回值:

  • Array 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

即,如果最后一个为数组,则会返回Array

参考链接

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
JavaScript slice() 方法