前言
這里解釋一下為什么“新姿勢”加了引號间校,這里的“新姿勢”是指矾克,我這一周內(nèi)根據(jù)新的項目需求,分析需求到實現(xiàn)需求的知識憔足、方法胁附;通過閱讀文章,而學(xué)到的新知識滓彰。也是對這一周的總結(jié)控妻,我也希望借此分享出來〗野螅可能你現(xiàn)在遇到了同樣的需求弓候,或許這篇文章可以幫到你。也可能你現(xiàn)在沒遇到這樣的需求洗做,也可以看看混個眼熟弓叛,說不定哪天碰到了,或許這篇文章可以幫到你诚纸。在此聲明一下,以后的文章中我都會使用新姿勢代替新知識陈惰,希望大家可以理解畦徘”献眩“新姿勢”這個欄目一周一篇,會在每周一更新上一周的“新姿勢”井辆,喜歡的老鐵可以點個贊关筒,分享一下,你的認可是我最大的動力~
將某一數(shù)值賦給某個變量的過程杯缺,稱為賦值蒸播。
例如:
1、let a = 10; b = a; a = 11;?
????console.log(a); // 11?
????console.log(b); // 10
2萍肆、let a = [1, 2, 3]; b = a; a = [4, 5, 6];
????console.log(a); // [4, 5, 6]
????console.log(b); // [1, 2, 3]
3袍榆、let a = [1, 2, 3]; b = a; a.pop();
????console.log(a); // [1, 2]
????console.log(b); // [1, 2]
4、let a = {a: 1, b: 2}; b = a; a = {a: 3, b: 4};
????console.log(a); // {a: 3, b: 4}
????console.log(b); // {a: 1, b: 2}
5塘揣、let a = {a: 1, b: 2}; b = a; a.b = 3;
????console.log(a); //?{a: 1, b: 3}
????console.log(b); //?{a: 1, b: 3}
仔細考慮2包雀、3、4亲铡、5兩個例子才写。有助于對賦值這個概念和定義的理解。
淺拷貝
淺拷貝是拷貝引用奖蔓,拷貝后的引用都是指向同一個對象的實例赞草,彼此之間的操作會互相影響。
淺拷貝分兩種情況吆鹤,拷貝直接拷貝源對象的引用 和 源對象拷貝實例厨疙,但其屬性(類型為Object,Array的屬性)拷貝引用檀头。
拷貝原對象的引用
這是最簡單的淺拷貝轰异。例如:
|
|
源對象拷貝實例暑始,其屬性對象拷貝引用
這種情況搭独,外層源對象是拷貝實例,如果其屬性元素為復(fù)雜雜數(shù)據(jù)類型時廊镜,內(nèi)層元素拷貝引用牙肝。對源對象直接操作,不影響另外一個對象嗤朴,但是對其屬性操作時候配椭,會改變另外一個對象的屬性的值。
常用方法為:Array.prototype.slice(),?Array.prototype.concat(),?jQury的$.extend({},obj)等雹姊。例如:
|
|
在堆中重新分配內(nèi)存吱雏,并且把源對象所有屬性都進行新建拷貝敦姻,以保證深拷貝的對象的引用圖不包含任何原有對象或?qū)ο髨D上的任何對象瘾境,拷貝后的對象與原來的對象是完全隔離,互不影響镰惦。
深拷貝后迷守,兩個對象,包括其內(nèi)部的元素互不干擾旺入。常見方法有遞歸兑凿,JSON.parse()、JSON.stringify()茵瘾,jQury的$.extend(true,{},obj)礼华,lodash的_.cloneDeep和_.clone(value, true)等。例如:
|
|
溫馨提示
本周的新姿勢就到這兒了,喜歡的朋友可以關(guān)注一下聘殖,分享一下晨雳,咱們下周見~