实现了深度复制对象,但是如何限制类型呢?
function isClass(o){
if(o === undefined){
return "Undefined";
}else {
return Object.prototype.toString.call(o).slice(8,-1);
}
}
function cloneObject(src){
var result,oClass = isClass(src);
if(oClass === "Object"){
result = {};
}else if (oClass === "Array") {
result = [];
}else{
return src;
}
for(key in src){
var copy = src[key];
if(isClass(copy) == "Object" || "Array"){
result[key]=arguments.callee(copy);
}else{
result[key]=src[key];
}
}
return result;
}
ringa_lee2017-04-10 15:11:03
函数槽点比较多..两次判断类型造成资源浪费,而且 isClass(o) === "Object" || "Array"
这句很显然是大错特错的,太想当然了。另外 arguments.callee
手册已经不推荐使用了,直接使用函数名会好一点。
function cloneObject(src){
var result;
switch(isClass(src)) {
case "Array": result = []; break;
case "Object": result = {}; break;
/** 如果是要过滤掉 Function 和 RegExp 的话 **/
case "RegExp":
case "Function": return null; break;
/** 结束 **/
default: return src; break;
}
for(key in src) {
var copy = cloneObject(src[key]);
if( copy != null ) result[key] = copy;
}
return result;
}
PHPz2017-04-10 15:11:03
判断类型玩个curry化
function isType(type) {
return function(obj) {
return {}.toString.call(obj) == "[object " + type + "]"
}
}
var isObject = isType("Object")
var isArray = Array.isArray || isType("Array")
isClass(copy) == "Object" || "Array" 这个错的有点严重啊