javascript中的變數類型思考

來源:互聯網
上載者:User

標籤:

有一個小任務,要求如下:

// 使用遞迴來實現一個深度複製,可以複製一個目標對象,返回一個完整拷貝
// 被複製的物件類型會被限制為數字、字串、布爾、日期、數組、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中的變數類型思考

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.