亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js對象淺拷貝和深拷貝詳解

 更新時間:2021年08月20日 15:09:22   作者:i10630226  
這篇文章主要為大家詳細介紹了JavaScript對象的淺拷貝和深拷貝代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家分享了JavaScript對象的淺拷貝和深拷貝代碼,供大家參考,具體內容如下

1.淺拷貝

拷貝就是把父對像的屬性,全部拷貝給子對象。

下面這個函數,就是在做拷貝:

var Chinese = {
  nation:'中國'
}
var Doctor = {
  career:'醫(yī)生'
}  
function extendCopy(p) {
    var c = {};
    for (var i in p) { 
      c[i] = p[i];
    }
    c.uber = p;
    return c;
 }

使用的時候,這樣寫:

var Doctor = extendCopy(Chinese);
Doctor.career = '醫(yī)生';
alert(Doctor.nation); // 中國

但是,這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正拷貝,因此存在父對象被篡改的可能。

請看,現(xiàn)在給Chinese添加一個”出生地”屬性,它的值是一個數組。

Chinese.birthPlaces = ['北京','上海','香港'];

通過extendCopy()函數,Doctor繼承了Chinese。

var Doctor = extendCopy(Chinese);

然后,我們?yōu)镈octor的”出生地”添加一個城市:

Doctor.birthPlaces.push('廈門');

看一下輸入結果

alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門
alert(Chinese.birthPlaces); //北京, 上海, 香港, 廈門

結果是兩個的出生地都被改了。

所以,extendCopy() 只是拷貝了基本類型的數據,我們把這種拷貝叫做“淺拷貝”。

2.深拷貝

因為淺深拷有如此弊端所以我們接下來看一下深拷貝

所謂”深拷貝”,就是能夠實現(xiàn)真正意義上的數組和對象的拷貝。它的實現(xiàn)并不難,只要遞歸調用”淺拷貝”就行了。

function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
      if (typeof p[i] === 'object') {
        c[i] = (p[i].constructor === Array) ? [] : {};
        deepCopy(p[i], c[i]);
      } else {
         c[i] = p[i];
      }
    }
    return c;
  }

看一下使用方法:

var Doctor = deepCopy(Chinese);

現(xiàn)在,給父對象加一個屬性,值為數組。然后,在子對象上修改這個屬性:

Chinese.birthPlaces = ['北京','上海','香港'];
Doctor.birthPlaces.push('廈門');

alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門
alert(Chinese.birthPlaces); //北京, 上海, 香港

這樣就完成了拷貝;

$.extend()

jquery 中$.extend()如同。

$.extend( [deep ], target, object1 [, objectN ] )

 •deep
類型: Boolean
如果是true,合并成為遞歸(又叫做深拷貝)。
 •target
類型: Object
對象擴展。這將接收新的屬性。
 •object1
類型: Object
一個對象,它包含額外的屬性合并到第一個參數.
 •objectN
類型: Object
包含額外的屬性合并到第一個參數 

當我們提供兩個或多個對象給$.extend(),對象的所有屬性都添加到目標對象(target參數)。

如果只有一個參數提供給$.extend(),這意味著目標參數被省略。在這種情況下,jQuery對象本身被默認為目標對象。這樣,我們可以在jQuery的命名空間下添加新的功能。這對于插件開發(fā)者希望向 jQuery 中添加新函數時是很有用的。

請記住,目標對象(第一個參數)將被修改,并且將通過$.extend()返回。然而,如果我們想保留原對象,我們可以通過傳遞一個空對象作為目標對象:

var object = $.extend({}, object1, object2);

在默認情況下,通過$.extend()合并操作不是遞歸的;如果第一個對象的屬性本身是一個對象或數組,那么它將完全用第二個對象相同的key重寫一個屬性。這些值不會被合并??梢酝ㄟ^檢查下面例子中 banana 的值,就可以了解這一點。然而,如果將 true 作為該函數的第一個參數,那么會在對象上進行遞歸的合并。

警告:不支持第一個參數傳遞 false 。

1. 合并兩個對象,并修改第一個對象。

var object1 = {
 apple: 0,
 banana: { weight: 52, price: 100 },
 cherry: 97
};
var object2 = {
 banana: { price: 200 },
 durian: 100
};

// Merge object2 into object1
$.extend( object1, object2 );

// Assuming JSON.stringify - not available in IE<8
console.log( JSON.stringify( object1 ) );
//{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}

2. 采用遞歸方式合并兩個對象,并修改第一個對象。

var object1 = {
 apple: 0,
 banana: { weight: 52, price: 100 },
 cherry: 97
};
var object2 = {
 banana: { price: 200 },
 durian: 100
};

// Merge object2 into object1, recursively
$.extend( true, object1, object2 );

// Assuming JSON.stringify - not available in IE<8
console.log( JSON.stringify( object1 ) );
//{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}

3. 合并 defaults 和 options 對象,并且不修改 defaults 對象。這是常用的插件開發(fā)模式。

var defaults = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };

// Merge defaults and options, without modifying defaults
var settings = $.extend( {}, defaults, options );


console.log(JSON.stringify( defaults ));
console.log(JSON.stringify( options ));
console.log(JSON.stringify( settings ));
//defaults -- {"validate":false,"limit":5,"name":"foo"}
//options -- {"validate":true,"name":"bar"}
//settings -- {"validate":true,"limit":5,"name":"bar"}

Javascript 判斷對象是否相等

在Javascript中相等運算包括”==”,”===”全等,兩者不同之處,不必多數,本篇文章我們將來講述如何判斷兩個對象是否相等? 你可能會認為,如果兩個對象有相同的屬性,以及它們的屬性有相同的值,那么這兩個對象就相等。那么下面我們通過一個實例來論證下:

var obj1 = {
  name: "Benjamin",
  sex : "male"
}

var obj2 = {
  name: "Benjamin",
  sex : "male"
}

//Outputs: false
console.log(obj1 == obj2);

//Outputs: false
console.log(obj1 === obj2);

通過上面的例子可以看到,無論使用”==”還是”===”,都返回false。主要原因是基本類型string,number通過值來比較,而對象(Date,Array)及普通對象通過指針指向的內存中的地址來做比較??聪旅嬉粋€例子:

var obj1 = {
  name: "Benjamin",
  sex : "male"
};

var obj2 = {
  name: "Benjamin",
  sex : "male"
};

var obj3 = obj1;

//Outputs: true
console.log(obj1 == obj3);

//Outputs: true
console.log(obj1 === obj3);

//Outputs: false
console.log(obj2 == obj3);

//Outputs: false
console.log(obj2 === obj3);

上例返回true,是因為obj1和ob3的指針指向了內存中的同一個地址。和面向對象的語言(Java/C++)中值傳遞和引用傳遞的概念相似。 因為,如果你想判斷兩個對象是否相等,你必須清晰,你是想判斷兩個對象的屬性是否相同,還是屬性對應的值是否相同,還是怎樣?

function person(name) { 
  this.name=name; 
} 

var p1 = new person("p1"); 
var p2 = new person("p2"); 

console.log(p1 == p2); //false 

person.prototype.sayHi = function() { 
  // do sayHi here 
} 

console.log(p1.sayHi() == p2.sayHi()); //true 
console.log(p1.sayHi() === p2.sayHi()); //true

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript 十六進制RGB色碼轉換器

    JavaScript 十六進制RGB色碼轉換器

    JavaScript 十六進制RGB色碼轉換器,大家可以學習下思路。
    2009-08-08
  • three.js中正交與透視投影相機的實戰(zhàn)應用指南

    three.js中正交與透視投影相機的實戰(zhàn)應用指南

    在three.js中攝像機的作用就是不斷的拍攝我們創(chuàng)建好的場景,然后通過渲染器渲染到屏幕中,下面這篇文章主要給大家介紹了關于three.js中正交與透視投影相機應用的相關資料,需要的朋友可以參考下
    2022-08-08
  • 十大熱門的JavaScript框架和庫

    十大熱門的JavaScript框架和庫

    這篇文章主要為大家詳細介紹了十大熱門的JavaScript框架和庫,前端必備,感興趣的小伙伴們可以參考一下
    2017-03-03
  • js實現(xiàn)同一頁面多個運動效果的方法

    js實現(xiàn)同一頁面多個運動效果的方法

    這篇文章主要介紹了js實現(xiàn)同一頁面多個運動效果的方法,涉及javascript操作頁面元素運動效果的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Typescript中的數據類型實例總結

    Typescript中的數據類型實例總結

    ts中數據類型的定義是重點之一,所以必須明確ts有哪些數據類型,下面這篇文章主要給大家介紹了關于Typescript中數據類型的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • bootstrap datetimepicker2.3.11時間插件使用

    bootstrap datetimepicker2.3.11時間插件使用

    這篇文章主要為大家詳細介紹了bootstrap datetimepicker2.3.11時間插件使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • prototype class詳解

    prototype class詳解

    prototype class詳解...
    2006-09-09
  • JavaScript中常用的字符串方法函數操作方法總結

    JavaScript中常用的字符串方法函數操作方法總結

    這篇文章主要介紹了JavaScript中所有的字符串函數操作方法整理匯總,包括字符串的長度、連接、查找、截取、替換、分隔、轉換等處理方法,以及網址中獲取文件名等等,需要的朋友可以參考下
    2023-12-12
  • JavaScript省市級聯(lián)下拉菜單實例

    JavaScript省市級聯(lián)下拉菜單實例

    這篇文章主要為大家詳細介紹了JavaScript省市級聯(lián)下拉菜單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript實現(xiàn)限時秒殺功能

    JavaScript實現(xiàn)限時秒殺功能

    各種電商活動都喜換選擇限時秒殺活動形式,這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)限時秒殺功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論