js深拷貝和淺拷貝
本章節介紹一下淺拷貝和深拷貝。
之所以出現深拷貝,也是由於要規避淺拷貝的缺陷,先來看一個淺拷貝的程式碼:
[JavaScript] 純文字檢視 複製程式碼var original = { age: 3, webName: "螞蟻部落", antzoneObj: { address: "青島市南區", target:"分享互助" } }; var extend = function (result, source) { for (var key in source) { result[key] = source[key]; } return result; } var newObj = extend({}, original); newObj.antzoneObj.address = "青島市北區"; console.log(newObj.antzoneObj.address); console.log(original.antzoneObj.address);
從上面的程式碼可以看出,雖然我只想修改新物件的屬性,但是原來物件的屬性也被改變了。
因為result[key] = source[key]傳遞的知識物件的儲存地址,{address: "青島市南區",target:"分享互助"}沒有真正被拷貝。
下面就來看一下深度拷貝:
[JavaScript] 純文字檢視 複製程式碼var original = { age: 3, webName: "螞蟻部落", antzoneObj: { address: "青島市南區", target:"分享互助" } }; dom = {}; dom.is = function (obj, type) { var toString = Object.prototype.toString, undefined; return (type === "Null" && obj === null) || (type === "Undefined" && obj === undefined) || toString.call(obj).slice(8, -1) === type; }; dom.deepCopy = function (result, source) { for (var key in source) { var copy = source[key]; if (result === copy) continue; if (dom.is(copy, "Object")) { result[key] = arguments.callee(result[key] || {}, copy); } else if (dom.is(copy, "Array")) { result[key] = arguments.callee(result[key] || [], copy); } else { result[key] = copy; } } return result; }; var newObj = dom.deepCopy({}, original); newObj.antzoneObj.address = "青島市北區"; console.log(newObj.antzoneObj.address); console.log(original.antzoneObj.address);
上面的程式碼實現深度拷貝效果,下面介紹一下它的實現過程。
一.程式碼註釋:
(1).var original = {
age: 3,
webName: "螞蟻部落",
antzoneObj: {
address: "青島市南區",
target:"分享互助"
}
},建立一個待拷貝的物件,內部巢狀有一個物件。
(2).dom = {},宣告一個空物件,其實用作一個名稱空間功能。
(3).dom.is = function (obj, type) {
var toString = Object.prototype.toString, undefined;
return (type === "Null" && obj === null) ||
(type === "Undefined" && obj === undefined) ||
toString.call(obj).slice(8, -1) === type;
},此方法的功能是準確判斷資料的型別,第一個引數要判斷的資料,第二個引數是型別,返回值是一個布林值。
dom.deepCopy = function (result, source) {},實現深度拷貝功能,第一個引數目標物件,第二個引數是要被拷貝的物件。
(4).for (var key in source) {},遍歷物件中的每一個屬性。
(5).var copy = source[key],獲取對應的屬性值。
(6).if (result === copy) continue,防止是同一個物件產生死迴圈。
(7).if (dom.is(copy, "Object")) {
result[key] = arguments.callee(result[key] || {}, copy);
},判斷是否是一個物件。然後用遞迴的方式進行拷貝操作。
result[key] || {}的作用是,如果目標物件中沒有同名屬性,那麼就使用一個空物件。
二.相關閱讀:
(1).prototype可以參閱javascript prototype原型一章節。
(2).call()可以參閱js call()一章節。
(3).slice()可以參閱javascript slice()一章節。
相關文章
- js 淺拷貝和深拷貝JS
- js 深拷貝和淺拷貝JS
- 淺探js深拷貝和淺拷貝JS
- js的深拷貝和淺拷貝JS
- js之淺拷貝和深拷貝JS
- JS深拷貝與淺拷貝JS
- js 深拷貝 vs 淺拷貝JS
- js實現深拷貝和淺拷貝JS
- iOS深拷貝和淺拷貝iOS
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- JavaScript深拷貝和淺拷貝JavaScript
- JavaScript淺拷貝和深拷貝JavaScript
- js 陣列的淺拷貝和深拷貝JS陣列
- [JS系列二]談談深拷貝和淺拷貝,如何實現深拷貝JS
- C++淺拷貝和深拷貝C++
- go slice深拷貝和淺拷貝Go
- JavaScript之深拷貝和淺拷貝JavaScript
- 聊聊物件深拷貝和淺拷貝物件
- ECMAScript-淺拷貝和深拷貝
- 深度解析深拷貝和淺拷貝
- Objective C淺拷貝和深拷貝Object
- java深克隆(深拷貝)和淺克隆(淺拷貝)Java
- vue深拷貝淺拷貝Vue
- python 指標拷貝,淺拷貝和深拷貝Python指標
- 淺談深拷貝與淺拷貝?深拷貝幾種方法。
- 【JS】深拷貝與淺拷貝,實現深拷貝的幾種方法JS
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- javascript 淺拷貝VS深拷貝JavaScript
- 理解JS中的淺拷貝與深拷貝JS
- js的淺拷貝和深拷貝和應用場景JS
- 淺談Java中的淺拷貝和深拷貝Java
- js 淺拷貝(淺複製、淺克隆)、深拷貝(深複製、深克隆)JS
- 深入淺出深拷貝與淺拷貝
- javaScript深拷貝和淺拷貝簡單梳理JavaScript
- Javascript知識點:淺拷貝和深拷貝JavaScript
- PHP中的淺拷貝和深拷貝薦PHP