標籤:
有一個小任務,要求如下:
// 使用遞迴來實現一個深度複製,可以複製一個目標對象,返回一個完整拷貝
// 被複製的物件類型會被限制為數字、字串、布爾、日期、數組、Object對象。不會包含函數、正則對象等
題目解析:
深度複製一個對象。首先明白這裡的對象有哪些類型:數字對象,字串對象,布爾對象,日期對象,數組對象,Object對象。
其中Number,String,Boolean對象是原始對象,String,Date,Array,Object對象是合成對象
數字對象的特點:http://www.w3school.com.cn/jsref/jsref_obj_number.asp
字串對象特點:http://www.w3school.com.cn/jsref/jsref_obj_string.asp
對於這些原始對象,直接根據類型(可以通過constructor來判斷,例如obj.constructor),然後直接建立該類型的對象,並且返回即可:
new Number(obj.valueOf()); new Boolean(obj.valueOf());new String(obj.valueOf());
對於複雜物件,那麼情況就不一樣了。
例如日期對象,日期對象的講解:http://www.w3school.com.cn/jsref/jsref_obj_date.asp
new Date(obj)和 new Date(obj.valueOf())均可以。
最需要關注的是數組對象和Object對象:
數組對象可以通過new Array或者字面量方式建立,此處推薦使用字面量建立:[];但是在給複製數組的時候,需要注意一個問題,數組的屬性是否複製?即當var src=[];src.name="gaga";的時候,src的name屬性,到底是否複製過去??
我的理解:既然是複製麼,就是一毛一樣,一毛一樣麼,自然要都複製了。所以在這裡用for(var i in src)的方式進行複製,也是可以理解的。
function cloneObject(src) {
if(src == null || src == undefined ||typeof(src) != "object"){
return src;
}else{
//為參考型別的
if(src.constructor == Array){//數組
var obj=[];
}else if(src.constructor == Date){//日期
obj = new Date(src);
}else{
obj={};
debugger;
obj.constructor = src.constructor;
obj.__proto__ = Object.getPrototypeOf(src);
}
for(var i in src){
if(typeof src[i] == "object"){//對象的屬性為對象
obj[i] = cloneObject(src[i]);//複製對象給obj
}else{
obj[i] = src[i];
}
}
return obj;
}
}
參考文檔:http://qianduanblog.com/post/js-learning-30-object-clone-copy.html
javascript中的變數類型思考