当我将1个范围分配给另一个范围时,我不知道为什么会这样:
$scope.test1 = "hello";
$scope.test1 = $scope.test2;
有时如果我改变$ scope.test2,$ scope.test1也会改变,有时候不会改变。 有时如果我改变$ scope.test1,$ scope.test2也会改变。
为什么会这样?也许我在承诺或类似的东西?
我不需要解决方案我只想要理论,angular.copy是解决方案。
这是我的代码:
$scope.topicsQuery.should = $scope.appliedOrFilters;
$scope.appliedOrFilters.splice(i, 1);
$scope.topicsQuery.should.splice(filtersToDelete[i],1);
然后,如果appliedOrFilters改变了topic.should也会改变,如果topicsQuery.should改变,applyOrFilters也会改变。
但是,如果我这样说:
$scope.topicsQuery.should = [];
没有任何改变。
.splice是否会更改对象的属性?
答案 0 :(得分:3)
来自Javascript by reference vs. by value
Javascript总是按值传递,但是当变量引用时 对象(包括数组),"值"是对象的引用。
更改变量的值永远不会更改基础 原始或对象,它只是将变量指向一个新的原语或 宾语。
- 但是,更改a引用的对象的属性 变量确实会改变底层对象。
因此,如果您更改对象引用,则无法更新。
$scope.test1 = "hello";
$scope.test2 = $scope.test1;
$scope.test1 = "world";
console.log($scope.test2); //prints "hello"
但是如果你改变一个对象的属性,它将被更新:
$scope.test1 = {"title": "hello"};
$scope.test2 = $scope.test1;
$scope.test1.title = "world";
console.log($scope.test2.title); //prints "world"
-
$scope.topicsQuery.should = $scope.appliedOrFilters;
将在2个变量上看到对数组.should
或.appliedOrFilters
的所有修改。
$scope.appliedOrFilters.splice(i, 1);
$scope.topicsQuery.should.splice(filtersToDelete[i],1);
如the documentation 所示,splice编辑数组本身,所以它很好。
$scope.topicsQuery.should = [];
在此创建一个新数组并将其分配给.should
。
所以.appliedOrFilters
仍指向前一个数组,完全正常。
如果你想删除数组,你应该做
$scope.topicsQuery.should.splice(0, $scope.topicsQuery.should.length);