簡體   English   中英

angular js-復制對象而不復制其引用

[英]angular js - copy object without their reference being copied

我需要在javascript中復制數組,以便兩個數組的地址都不同。 如何做呢..

我努力了

$scope.users = data.users;
 $scope.usersTemp = [];
$scope.usersTemp.push($scope.users );

and
 $scope.usersTemp = $scope.usersTemp

您嘗試過angular.copy嗎? 就像是 :

$scope.usersTemp = angular.copy($scope.usersTemp)

https://docs.angularjs.org/api/ng/function/angular.copy

您可以使用:

angular.copy ( myObjorArrayetc )

您正在嘗試做的事情似乎是創建JS數組的淺表副本 如果這不是您的用例,請告訴我。

在JS中有幾種方法可以做到這一點

const copy = [...original]; // es6 only, uses Symbol.iterator
const copy = original.slice(); // slices the array from index 0,      
                               // returning a shallow copy

const copy = Array.from(original, val => val); // es6 only, takes an 
// array-like object with .length property and a map function
const copy = original.map(x => x); 
// call to Array.prototype.map with identity function.

有了這些,您可以:

const a = [1, 2];
const b = // shallow copy with one of the methods
a.push(3); // and b is still [1, 2]

關於其他答案的快速注釋:快速瀏覽此處的angular文檔似乎表明angular.copy返回了深層副本

掌握差異非常重要:淺表副本只會創建一個新對象並將所有值放入其中,而深表副本將嘗試為每個值創建一個副本。 這意味着,由於JS中的對象是可變的,因此,如果創建淺表副本,您仍將與其他副本共享其所有值。 深度復制不是這種情況。

例如:

const a1 = [{a: {b: 3}}];
const a2 = // shallow copy
(a1 === 2) // false
a1[0].a.b = 4 // reassign a prop of a value contained inside a1
(a1[0].a.b === 4) // true 

如果制作了深拷貝,則將制作一個新對象。

結論:根據用例使用所需的東西。 淺表副本可以快速創建,但是容易發生不必要的突變,深表副本的創建成本更高,但不受共享訪問引起的突變的影響。 附帶說明一下,這兩種方法當然會對GC產生影響(這意味着淺表復制不會釋放對原始所包含值的引用)。

您可以使用

var copy = angular.copy(object);

它將精確復制對象。

如果使用數組的賦值操作,則復制和原始對象都將綁定更改。 因此,請使用angular.copy(oldArray, newArray)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM