JS引用類型與對象拷貝

基本類型和引用類型#

ECMAScript包含兩種不同的數(shù)據(jù)類型:基本類型值和引用類型值;

  • 基本類型值指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,null,undefined,Boolean,Number和String都是基本數(shù)據(jù)類型,它們都是按值訪問的,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際值;

  • 引用類型值(對象径密、數(shù)組舆逃、函數(shù)、正則):指的是那些保存在堆內(nèi)存中的對象狈涮,變量中保存的實(shí)際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置隆箩,由該位置保存對象

  • 值得注意的是:string雖然屬于基本類型,但是由于自身只讀的原因,是無法修改的,這導(dǎo)致給相同的字符串賦不同的變量,不同的變量指向了同一個字符串的位置,在這點(diǎn)上有點(diǎn)類似引用類型.

<h2>JS的內(nèi)存空間</h2>
這里兩篇文章有利于理解js的內(nèi)存空間問題
博客園文章
內(nèi)存空間圖解

<h2>深淺拷貝</h2>
在Javascript 中辖所,將一個對象賦值給一個變量其實(shí)只是將這個對象的引用拷貝了一份;
<h4>淺拷貝:</h4>
主要針對對象等引用類型
所謂淺拷貝,個人理解就是簡單的拷貝了引用關(guān)系,指針指向依然是指向堆內(nèi)存中的同一個存儲地址,這樣當(dāng)我們改變一個對象的屬性的時候,另一個對象的屬性也跟著改變了(因?yàn)閷?shí)質(zhì)只是對象的名稱改變了,指向沒有改變,或者說實(shí)質(zhì)上的鍵值對并沒有改變)
舉例說明:
var a = {name :"frank"}; b = a;//將a的值(存放指向堆內(nèi)存中內(nèi)容的地址指針)拷貝給b b.name = "jack"; a.name === "jack";//這種情況就是淺拷貝,當(dāng)改變b的屬性時,a的屬性也會跟著發(fā)生改變

<h4>深拷貝</h4>
所謂深拷貝,個人理解就是將被拷貝對象的所有內(nèi)容完全復(fù)制,并在堆內(nèi)存中開辟了一個新的內(nèi)存空間來存放,這個時候拷貝對象和被拷貝對象是完全獨(dú)立的兩個變量,當(dāng)拷貝對象或者被拷貝對象的內(nèi)容發(fā)生改變時,并不會互相影響;
沿用上面的例子:
var a = {name :"frank"}; b = a;//將a的值(存放指向堆內(nèi)存中內(nèi)容的地址指針)拷貝給b b.name = "jack"; a.name === "jack";//這種情況就是淺拷貝,當(dāng)改變b的屬性時,a的屬性也會跟著發(fā)生改變 b = deepClone(a);//利用深拷貝函數(shù)拷貝a,這個時候就a,b就是兩個獨(dú)立的變量,互不影響 b.name ="jack"; a,name = "frank";

知乎專欄關(guān)于深淺拷貝文章

<h1>復(fù)習(xí)部分</h1>

<h2>1.引用類型有哪些擅笔?非引用類型有哪些</h2>

  • 非引用類型有基本數(shù)據(jù)類型,基本數(shù)據(jù)類型指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段;
  • 引用類型值一般有對象,數(shù)組,函數(shù)及正則表達(dá)式,指的是保存在堆內(nèi)存中的對象,變量中保存的實(shí)際上是一個指針(地址),指向了引用類型的實(shí)際值;

<h2>2.如下代碼輸出什么险胰?為什么</h2>


  //簡單分析
  //1.利用對象字面量(文本代碼)方法構(gòu)造兩個對象obj1及obj2
//2.obj1 == obj2, obj1與obj2存放的地址應(yīng)該不一致,所以是不等的
//3.console.log(obj1 == obj2)輸出應(yīng)該為false;
/*4.將obj2中的地址賦給了obj1,此時兩者存放的指針指向的儲值地址應(yīng)該是一致的*/
//5.console.log(obj1 = obj2),輸出的應(yīng)該是obj2對象的鍵值對;
//6.console.log(obj1 == obj2),地址一致,輸出應(yīng)該是true

與分析是一致的;

<h2>3.如下代碼輸出什么? 為什么</h2>

  • 1.定義4個變量,分別為整型,對象,以及數(shù)組;

  • 2.又定義4個變量,其中aa,bb數(shù)值為單純復(fù)制1,2
    cc與c的存儲指針指向一致,dd與d存儲的指針指向一致;

    1. a,b存儲的值分別變?yōu)?1,22;
      c.name改變,相應(yīng)的cc.name也會改變,因?yàn)榇尜A的指針指向是一致的
      d[2]['age'] = 3 相當(dāng)于改變了下標(biāo)為2的數(shù)組對象的age屬性值為3,即c.age=3同時cc.age=3;
  • 4.console.log(aa)輸出為1

  • 5.console.log(bb)輸出為2

  • 6.console.log(cc)輸出為Object{
    name:'hello',
    age:3
    };

  • 7.console.log(dd)輸出為array[
    0:1
    1:2;
    2:object{
    name:"hello",
    age: 3
    }
    ];

<h2>4.如下代碼輸出什么? 為什么</h2>

  • 聲明并定義變量a,b,分別為整型及對象;
  • 聲明兩個函數(shù)f1及f2;
  • 調(diào)用f1(),傳入?yún)?shù)a,a=1;
  • function f1(n){
    var n = a;//相當(dāng)于單純復(fù)制了值;
    ++n;//n變?yōu)榱?1,但是對a并沒有影響;
    }
  • 調(diào)用f2(),傳入?yún)?shù)c,c存貯指向?qū)嶋H值地址的指針;
  • function f2(c){
    var obj = c;//變量obj存儲指針一致
    ++obj.age//相當(dāng)于c.age+1
    }
  • console.log(a),輸出1;
  • console.log(c),輸出:
    object{
    name:"饑人谷",
    age:3
    };

<h2>5.過濾如下數(shù)組汹押,只保留正數(shù),直接在原數(shù)組上操作</h2>

 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);
            filter(arr);
        }
    }
 }
 filter(arr);
 console.log(arr);//[3,1,2]

<h2>6.過濾如下數(shù)組起便,只保留正數(shù)棚贾,原數(shù)組不變,生成新數(shù)組</h2>

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

<h2>7.寫一個深拷貝函數(shù)榆综,用兩種方式實(shí)現(xiàn)</h2>

  • 第一種
    var person={
    name:"wuyanwen",
    age: 24
    };
    function deepCopy(oldObj) {
    var newObj = {};
    for(var key in oldObj) {
    if(typeof oldObj[key] === 'object') {
    newObj[key] = deepCopy(oldObj[key]);
    }else{
    newObj[key] = oldObj[key];
    }
    }
    return newObj;
    }
    var newPerson = deepCopy(person)
    newPerson.name = "wuyanwen24";
    console.log(person.name);
    console.log(newPerson.name);

  • 第二種
    var person={
    name:"wuyanwen",
    age: 24
    };
    function copy(obj){
    var newobj = JSON.parse(JSON.stringify(obj));
    return newobj;
    }
    var newPerson = copy(person);
    newPerson.name = "wuyanwen24";
    console.log(person.name);
    console.log(newPerson.name);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妙痹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鼻疮,更是在濱河造成了極大的恐慌怯伊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件判沟,死亡現(xiàn)場離奇詭異震贵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)水评,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媚送,“玉大人中燥,你說我怎么就攤上這事√临耍” “怎么了疗涉?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵拿霉,是天一觀的道長。 經(jīng)常有香客問我咱扣,道長绽淘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任闹伪,我火速辦了婚禮沪铭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偏瓤。我一直安慰自己杀怠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布厅克。 她就那樣靜靜地躺著赔退,像睡著了一般。 火紅的嫁衣襯著肌膚如雪证舟。 梳的紋絲不亂的頭發(fā)上硕旗,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音女责,去河邊找鬼漆枚。 笑死,一個胖子當(dāng)著我的面吹牛鲤竹,可吹牛的內(nèi)容都是我干的浪读。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼辛藻,長吁一口氣:“原來是場噩夢啊……” “哼碘橘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吱肌,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痘拆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氮墨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺蛆,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年规揪,在試婚紗的時候發(fā)現(xiàn)自己被綠了桥氏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡猛铅,死狀恐怖字支,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤堕伪,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布揖庄,位于F島的核電站,受9級特大地震影響欠雌,放射性物質(zhì)發(fā)生泄漏蹄梢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一富俄、第九天 我趴在偏房一處隱蔽的房頂上張望禁炒。 院中可真熱鬧,春花似錦蛙酪、人聲如沸齐苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凹蜂。三九已至,卻和暖如春阁危,著一層夾襖步出監(jiān)牢的瞬間玛痊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工狂打, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擂煞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓趴乡,卻偏偏與公主長得像对省,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晾捏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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