面试题:实现一个方法clone;可以对js五种数据类型进行值复制

//先来方法的代码
function clone(obj) {
var copy;
switch(typeof obj){
case 'number':
case 'string':
case 'boolean':
copy = obj;
break;
case 'object':
if (obj == null) {
copy = null
} else if (toString.apply(obj) === '[object Array]') {
copy = [];
for (var i in obj) {
copy.push(clone(obj[i]))
};
} else {
copy = {};
for (var j in obj) {
copy[j] = clone(obj[j]);
}
}
}
return copy;
}

number , string , boolean 直接赋值

object , array 遍历后赋值

方法中用到的apply方法

apply方法: 
语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

call方法: 
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
说明: 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

  //各种类型的返回值; call 和 apply 返回值相同; 只是参数不同
   console.log("string" +toString.apply(str)) // string[object String]
console.log("number" +toString.apply(num)) // number[object Number]
console.log("object" +toString.apply(obj)) // object[object Object]
console.log("array" + toString.apply(arr)) // array[object Array]
console.log("boolean" + toString.apply(bool)) // boolean[object Boolean]
console.log("undefined" + toString.apply(undefined))   //undefined[object Undefined]
console.log("null" + toString.apply(null))    // null[object Null]
上一篇:- Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as