引用類(lèi)型對(duì)象拷貝

1.引用類(lèi)型有哪些?非引用類(lèi)型有哪些
非引用類(lèi)型值笑陈,即基本類(lèi)型值(數(shù)值际度,布爾值,undefined涵妥,null):指保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段甲脏。
引用類(lèi)型值(對(duì)象,數(shù)組,函數(shù)块请,正則):值保存在堆內(nèi)存中的對(duì)象娜氏;變量實(shí)際保存的是一個(gè)指針,這個(gè)指針是用來(lái)指向另一個(gè)位置墩新,該位置用來(lái)保存對(duì)象贸弥。
2.如下代碼輸出什么?為什么

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);

結(jié)果:false ; object {a:1,b:2} ; true
obj1 == obj2是判斷兩個(gè)變量是否相等海渊;由于對(duì)對(duì)象聲明變量绵疲,變量實(shí)際保存的是對(duì)象在內(nèi)存中的位置的指針;所以是聲明的是兩個(gè)指針臣疑,故不相等盔憨。
obj1 = obj2;是把obj2的指針賦值給obj1讯沈,同時(shí)郁岩,他們指向同一塊內(nèi)存。所以缺狠,輸出obj1的值就是obj2的對(duì)象问慎。
之前由于obj1 = obj2,把obj2的指針賦值給obj1挤茄,所以他們是相等的如叼,結(jié)果為true。
3.如下代碼輸出什么? 為什么

var a = 1
var b = 2
var c = { name: '饑人谷', age: 2 }
var d = [a, b, c]`

var aa = a
var bb = b
var cc = c
var dd = d`

a = 11
b = 22
c.name = 'hello
d[2]['age'] = 3
console.log(aa) 
console.log(bb) 
console.log(cc)
console.log(dd)

結(jié)果:
aa=1;
因?yàn)閍是基本類(lèi)型值穷劈,在a=11笼恰,之前,a=1的值已經(jīng)賦值給aa歇终。
bb=2;
同理挖腰,b也是基本類(lèi)型值。
cc={name:hello, age:3}练湿;
因?yàn)閏是引用類(lèi)型值猴仑,所以cc=c,是把c的指針賦值給cc肥哎,令這兩個(gè)變量指向同一個(gè)內(nèi)存辽俗。故,對(duì)c的內(nèi)存的值改變篡诽,即會(huì)使cc的值發(fā)生改變崖飘。又由于d[2]['age'] = 3,即數(shù)組d的第三個(gè)值的age屬性的值變?yōu)?杈女。直接改變的是值朱浴,而不是指針吊圾。

dd = [1, 2, {name: hello , age:3}];
同理翰蠢,dd 是引用類(lèi)型值项乒,由于c.name = 'hello'd[2]['age'] = 3共同改變內(nèi)存中的值。
4.如下代碼輸出什么? 為什么

var a = 1
var c = { name: 'jirengu', age: 2 }`

`function f1(n){
  ++n
}
function f2(obj){
  ++obj.age
}`

`f1(a) 
f2(c) 
f1(c.age) 
console.log(a) 
console.log(c)

結(jié)果:
a=1梁沧;
執(zhí)行函數(shù)f1(a)檀何,在f1(n)函數(shù)中,發(fā)生了廷支,var n = a频鉴,所以++n實(shí)際上是n=++n,并沒(méi)有對(duì)a的值做出改變恋拍。故a=1垛孔。
{name:'jirengu',age:3}施敢;
當(dāng)執(zhí)f2(c)時(shí)周荐,在f2(obj)函數(shù)中,發(fā)生了悯姊,var obj=c,即c變量是把指針賦值給obj了贩毕,令這兩個(gè)變量指向同一個(gè)內(nèi)存悯许。當(dāng)++obj.age,執(zhí)行的是對(duì)age屬性的值加1辉阶,故變量c的指針指向的內(nèi)存的值發(fā)生改變先壕。
當(dāng)執(zhí)行f1(c.age)時(shí),在1(n)函數(shù)中谆甜,發(fā)生了垃僚,var n=c.age

5.過(guò)濾如下數(shù)組规辱,只保留正數(shù)谆棺,直接在原數(shù)組上操作

1.利用push() 方法將一個(gè)或多個(gè)元素添加到數(shù)組的末尾,并返回?cái)?shù)組的新長(zhǎng)度罕袋。

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
    var newArr = [];
    for(var i=0 ; i<arr.length; i++){
    if(arr[i]>0){
    newArr.push(arr[i]);
    }
}
return newArr;
}
filter(arr);
arr= filter(arr);
console.log(arr) // [3,1,2]

2.利用splice() 方法通過(guò)刪除現(xiàn)有元素來(lái)更改數(shù)組的內(nèi)容改淑。注意,如果添加進(jìn)數(shù)組的元素個(gè)數(shù)不等于被刪除的元素個(gè)數(shù)浴讯,數(shù)組的長(zhǎng)度會(huì)發(fā)生相應(yīng)的改變朵夏。

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
    for(var i=0 ; i<arr.length; i++){
        if(arr[i]<=0){
            arr.splice(i,1);//添加0個(gè)元素,刪除一個(gè)榆纽,length發(fā)生改變仰猖。
            i--;
        }
    }
return
}
filter(arr)
console.log(arr)

6.過(guò)濾如下數(shù)組捏肢,只保留正數(shù),原數(shù)組不變饥侵,生成新數(shù)組
定義新的數(shù)組鸵赫,就會(huì)有新的指針,遍歷原數(shù)組到新數(shù)組即可爆捞。

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
    var newArr = [];
    for(var i=0 ; i<arr.length; i++){
    if(arr[i]>0){
    newArr.push(arr[i]);
    }
}
return newArr;
}
var arr2 = filter(arr)
console.log(arr2)
console.log(arr)

7.寫(xiě)一個(gè)深拷貝函數(shù)奉瘤,用兩種方式實(shí)現(xiàn)
淺拷貝:只拷貝對(duì)象的基本類(lèi)型值,如果某一個(gè)屬性是引用類(lèi)型值煮甥,拷貝的就是這個(gè)引用類(lèi)型的指針盗温。當(dāng)原對(duì)象的引用類(lèi)型值發(fā)生改變,則淺拷貝后的新對(duì)象的引用類(lèi)型值也會(huì)發(fā)生改變成肘,但非引用類(lèi)型值不變卖局。

深拷貝:拷貝對(duì)象的所有屬性,無(wú)論是引用類(lèi)型值還是非引用類(lèi)型值双霍,拷貝之后的新對(duì)象砚偶,與原對(duì)象沒(méi)有任何關(guān)系。
1洒闸、用遞歸實(shí)現(xiàn)深拷貝

var obj = {
        name: 'ruoyu',
        sex: 'male',
        age: 30,
        friend: {
            name: 'hello', 
            age: 100
        }
    };
function deepCopy(oldObj){
    var newObj = {};
    for(var key in oldObj){
        if(typeof oldObj[key]==='number'||typeof oldObj[key]==='string'||
        typeof oldObj[key]==='boolean'||oldObj[key]=== 'undefined'
        ||oldObj[key]=== 'null'){
            newObj[key] = oldObj[key] ;
        }else
        {
            newObj[key] = deepCopy(obj[key]);
        }
    }
    return newObj;
}

var obj2 = deepCopy(obj);
obj.friend.age = 10;
console.log(obj2)

其實(shí)是否是深拷貝染坯,還與obj.friend.age = 10;var obj2 = deepCopy(obj);相對(duì)順序有關(guān),如果是

obj.friend.age = 10;
var obj2 = deepCopy(obj);
console.log(obj2)

則對(duì)obj.friend.age重新賦值丘逸,再執(zhí)行函數(shù)单鹿,則是淺拷貝,實(shí)際運(yùn)用中當(dāng)注意這點(diǎn)深纲。

(typeof oldObj[key]==='number'||typeof oldObj[key]==='string'||
        typeof oldObj[key]==='boolean'||oldObj[key]=== 'undefined'
        ||oldObj[key]=== 'null')

即使引用類(lèi)型值包括函數(shù)仲锄、正則,用這種基本類(lèi)型值判斷湃鹊,同樣可以深拷貝儒喊。
2、
使用JSON

function deepCopy(obj){
    var newObj=JSON.stringify(obj)
    var newObj1 = JSON.parse(newObj);
    return newObj1;
}

注意:
復(fù)合類(lèi)型的值只能是數(shù)組或?qū)ο蟊液牵荒苁呛瘮?shù)怀愧、正則表達(dá)式對(duì)象、日期對(duì)象余赢。
簡(jiǎn)單類(lèi)型的值只有四種:字符串掸驱、數(shù)值(必須以十進(jìn)制表示)、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)没佑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毕贼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛤奢,更是在濱河造成了極大的恐慌鬼癣,老刑警劉巖陶贼,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異待秃,居然都是意外死亡拜秧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)章郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枉氮,“玉大人,你說(shuō)我怎么就攤上這事暖庄×奶妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵培廓,是天一觀的道長(zhǎng)惹悄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肩钠,這世上最難降的妖魔是什么泣港? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮价匠,結(jié)果婚禮上当纱,老公的妹妹穿的比我還像新娘。我一直安慰自己踩窖,他們只是感情好坡氯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著毙石,像睡著了一般廉沮。 火紅的嫁衣襯著肌膚如雪颓遏。 梳的紋絲不亂的頭發(fā)上徐矩,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音叁幢,去河邊找鬼滤灯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛曼玩,可吹牛的內(nèi)容都是我干的鳞骤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黍判,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼豫尽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起顷帖,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤美旧,失蹤者是張志新(化名)和其女友劉穎渤滞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榴嗅,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妄呕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗽测。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绪励。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唠粥,靈堂內(nèi)的尸體忽然破棺而出疏魏,到底是詐尸還是另有隱情,我是刑警寧澤厅贪,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布蠢护,位于F島的核電站,受9級(jí)特大地震影響养涮,放射性物質(zhì)發(fā)生泄漏葵硕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一贯吓、第九天 我趴在偏房一處隱蔽的房頂上張望懈凹。 院中可真熱鬧,春花似錦悄谐、人聲如沸介评。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)们陆。三九已至,卻和暖如春情屹,著一層夾襖步出監(jiān)牢的瞬間坪仇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工垃你, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椅文,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓惜颇,卻偏偏與公主長(zhǎng)得像皆刺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凌摄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.引用類(lèi)型有哪些羡蛾?非引用類(lèi)型有哪些 非引用類(lèi)型值,即基本類(lèi)型值(數(shù)值锨亏,布爾值痴怨,undefined煎殷,null):指...
    LINPENGISTHEONE閱讀 205評(píng)論 0 0
  • 1.引用類(lèi)型有哪些?非引用類(lèi)型有哪些2.如下代碼輸出什么腿箩?為什么? var obj1 = {a:1, b:2}; ...
    Rising_suns閱讀 248評(píng)論 0 0
  • 1.引用類(lèi)型有哪些豪直?非引用類(lèi)型有哪些 基本類(lèi)型值(Number、Boolean珠移、string弓乙、null和undef...
    saintkl閱讀 355評(píng)論 0 0
  • .引用類(lèi)型 & 非引用類(lèi)型 引用類(lèi)型值(對(duì)象、數(shù)組钧惧、函數(shù)暇韧、正則):指的是那些保存在堆內(nèi)存中的對(duì)象,變量中保存的實(shí)際...
    邢烽朔閱讀 323評(píng)論 0 0
  • 引用類(lèi)型有哪些浓瞪?非引用類(lèi)型有哪些 基本類(lèi)型值(Undefined懈玻、Null、Boolean乾颁、Number和Stri...
    jamesXiao_閱讀 145評(píng)論 0 0