在js中,變量所存的值分爲了原始類型和引用類型,其中Number,String是原始值,其餘是引用值。編程
原始類型的值在傳遞過程當中是按值傳遞,而引用類型傳遞的則是指針,即傳遞的僅僅只是引用關係,並不是真正的值,若內存中的真實值被修改,則全部引用此值的變量都會被更新。數組
在複製對象的過程當中,若是僅複製了引用指針,則稱爲淺複製;複製了真實值,則稱爲深複製。this
淺拷貝:spa
淺拷貝通常都是直接將對象賦值給新變量就完事兒了,對於原始值來講,副本和正本今後沒啥關係了。而對於引用類型,像數組和對象之類的值,副本和正本拿到的是同一個數據,數據更新後,正本和副本都會更新。指針
var obj = { name :'zhouxiaohouer', age:24, assets:{ cash:1234, stock:22222 }, say:function() { console.log(this.name) } } var objb = obj obj.name = 'fixed' console.log(obj.name)//fixed console.log(objb.name)//fixed
深拷貝:
深拷貝本質上是遞歸實現淺拷貝,深拷貝以後,副本和正本今後也沒啥關係了。code
var obj = { name :'zhouxiaohouer', age:24, assets:{ cash:1234, stock:22222 }, say:function() { console.log(this.name) } } function deepCopy(o) { var backup = {} for(var key in o){ backup[key] = typeof o[key] === 'object'?deepCopy(o[key]):o[key] } return backup } var objb = deepCopy(obj) obj.name = 'fixed' console.log(obj.name)//fixed console.log(objb.name)//zhouxiaohouer
數組的深拷貝則能夠藉助Array.slice(start[,end])來實現,對象的Object.create方式見面向對象編程系列。對象