看過沒用過,一看我就是個假的前端,說實在的,還真的沒用過
百度一番:貼上地址
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
學(xué)習(xí)了下,做個小筆記:
Object.assign 是將可枚舉的屬性值復(fù)制到目標(biāo)對象,返回目標(biāo)對象,語法如下:
Object.assign(target,...sources);
合并對象
[1,2,3] ===> {0:1,1:2,3:3}
[4,5] ===> {0:4,1:5}
這個時候就會合并相同屬性,后面的值替換目標(biāo)對象原有的值
let arr1 = [1,2,3];
let arr2 = Object.assign([4,5],arr1);
console.log(arr2); // [1,2,3]
復(fù)制一個對象
let obj = {name: 'zs',age: 14};
let obj1 = Object.assign({},obj);
//let obj1 = {...obj}; //也可以用拓展運算符
obj.age = 18;
console.log(obj); //{name: "zs", age: 18}
console.log(obj1); //{name: "zs", age: 14}
這種復(fù)制是淺拷貝,因為當(dāng)源屬性值是一個【對象的引用】 時,源屬性值的對象改變會呈現(xiàn)在目標(biāo)對象上
let obj = {name: 'zs',age: 14,say: {word:'說啦!'}};
let obj1 = Object.assign({},obj);
// let obj1 = {...obj}; //也可以用拓展運算符
obj.age = 18;
obj.say.word = '不說!';
console.log(obj); //{name: "zs", age: 18,say:{word: '不說!'}}
console.log(obj1); //{name: "zs", age: 14,say:{word: '不說!'}}
問題來啦 上面說到淺拷貝,那么什么是淺拷貝? 有淺拷貝了,辣么是否有深拷貝,兩者有何區(qū)別? 一堆不懂 頭都大了
舉個栗子:
let obj1 = {
name: 'www'
};
let obj2 = obj1;
console.log(obj2); //{name: www}
obj1.name = 'baidu';
console.log(obj2); //{name: baidu}
通俗點理解:從上面栗子看,當(dāng)obj1改變的時候,obj2也發(fā)生了改變,這種拷貝就淺拷貝,如果當(dāng)obj1發(fā)生變化的時候 obj2不會變化,兩個對象互不影響就是深拷貝了
先來說個事 為何上面obj1變化,obj2會變化,
原因是: 引用類型保存在棧內(nèi)存里的是堆內(nèi)存里的一個引用地址,通過這個引用地址可以快速查找到保存在堆內(nèi)存里的對象,所以 其實obj1和obj2都指向同一個值
辣么深拷貝可以理解成 obj2拿了obj1的值后,自己自立門戶,從此obj1怎么改都不關(guān)obj2的事 ,obj2改變也不關(guān)obj1的事
怎么實現(xiàn):哈哈!方法如下:::
// 第一種 深拷貝 借助JSON.stringify和JSON.parse
let obj1 = {
name: 'www'
};
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
let obj2 = deepCopy(obj1);
console.log(obj2); //{name: "www"}
obj1.name = 'yixia';
console.log(obj1); //{name: "yixia"}
console.log(obj2); //{name: "www"}
// 第二種 借助jquery $.extend(isdeep,target,...soures);
let obj1 = {
name: 'www'
};
let obj2 = $.extend(true,{},obj1);
obj1.name = 'yixia';
console.log(obj2); //{name: "www"}
js中的數(shù)據(jù)類型有兩種,分別是基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
基本數(shù)據(jù)類型:string boolean number null undefined
引用類型:Object array function
區(qū)別:
1、內(nèi)存分配不同: 基本類型 存在棧內(nèi)存中,引用類型存在堆內(nèi)存中,將該堆內(nèi)存的指針存在棧內(nèi)存中
2、訪問機制不同: 基本類型直接訪問棧內(nèi)存里的變量,引用類型通過存在棧內(nèi)存里的指針指向棧內(nèi)存里的對象
3、復(fù)制變量的不同:基本類型將復(fù)制一個副本賦值,之后兩個值相互獨立,引用類型賦值一個指針,指向同一個堆內(nèi)存里的對象
4、傳遞參數(shù)不同,將實參復(fù)制給形參的過程,js中的方法的參數(shù)都是按值傳遞的,
基本類型將變量的值復(fù)制給形參后,這個形參跟該變量沒有關(guān)系,
引用類型將棧內(nèi)存這個指針傳遞給參數(shù),之后這個形參發(fā)生任何改變都會體現(xiàn)在外部的這個對象上,主要原因還是因為引用方式的不同