/* * 基本類型保存在棧內存,引用類型保存在堆內存,堆比棧大(適合存放大數據),棧比堆速度快(適合查找) * * 基本類型:undefined null Number String Boolean * 引用類型:Object * * 基本類型賦值:a=3;b=a;b=4;console.log(a,b) //3,4 * 引用類型賦值:在賦值時,只是將數據的地址賦給一個變量,沒有把數據也給它,當改變這個數據時,引用地址的變量的值都會改變 * var a={ //a指向一個數據的地址 name:'zzz' }; var b=a; //將這個地址賦值給b b.name='sss' //b修改數據,a和b共享數據,於是a的數據也發生改變 console.log(b.name); //sss console.log(a.name); //sss a={ //a重新指向一個地址 此時b指向的地址依舊是name:sss name='zsm' } console.log(b.name) //sss console.log(a.name) //zsm * */ /* * 淺拷貝:只拷貝對象的第一層屬性,基本數據類型爲拷貝,引用類型爲引用地址,那麼就不會發生拷貝而是會發生引用例如{name:{...}}則name'仍舊是引用 * 在一個爲引用類型(Object)的變量:這個變量是一個對象時,將這個a變量賦值給另一個b變量,b改變值,a也會改變 * //淺拷貝的實現 function copyClone(obj) { var newobj={} //創建一個對象 for(var i in obj){ newobj[i]=obj[i] //迭代舊對象,將舊對象的值傳給新對象 }; return newobj }; var obj={ name:111 }; var obj2=copyClone(obj); obj2.name='zz'; console.log(obj); //name:111 console.log(obj2); //name:'zz' 實現淺拷貝的方法:建立一個新的對象,循環遍歷傳入的參數對象,將該對象的值push進新的對象
function copyClone(obj) { var newobj={} for(var i in obj){ newobj[i]=obj[i] }; return newobj }; var obj={ name:111, data:{ type:'get' } }; var obj2=copyClone(obj); obj2.name='zz'; obj.data.type='post'; console.log(obj); //111 post console.log(obj2); //zz post
深拷貝:和淺拷貝不同,它是將數據賦給一個變量,而不只是將數據的地址賦給變量 1、使用json var obj2=JSON.parse(JSON.stringify(obj2));----壞處:拋棄原來的constructor,對象只能是能被JSON識別的數據 2、使用assign var obj2=Object.assign({},obj1),如此一來obj2的修改完全影響不到obj1了,但是注意這裏的obj1只能是一個簡單對象,如{name:...}不能是一個複雜對象:{name:{....}} 3、使用create * */