Javascript 角度非故意绑定/对象镜像

Javascript 角度非故意绑定/对象镜像,javascript,angularjs,variables,Javascript,Angularjs,Variables,因此,我正在使用AngularJS进行一个项目,在这个项目中,我需要能够将作用域中的对象的值与其以前记录的值进行比较。我是通过一个算法来实现的,比如下面的算法: function() { var data = [ { id: 1, key: 'value', foo: 'bar'}, { id: 2, key: 'value', foo: 'bar'} ] $scope.oldTarget = data[0]; $scope.tar

因此,我正在使用AngularJS进行一个项目,在这个项目中,我需要能够将作用域中的对象的值与其以前记录的值进行比较。我是通过一个算法来实现的,比如下面的算法:

function() {
    var data = [
        { id: 1, key: 'value', foo: 'bar'},
        { id: 2, key: 'value', foo: 'bar'}
    ]
    $scope.oldTarget = data[0];
    $scope.target = data[0];
}
现在如果我要做:

function() {
    $scope.target.foo = 'fighters';

    if ($scope.target != $scope.oldTarget) console.log('Target was modified');
    console.log($scope.target);
    console.log($scope.oldTarget);
}
它将输出:

{ id: 1, key: 'value', foo: 'fighters'}
{ id: 1, key: 'value', foo: 'fighters'}

我的假设是AngularJS自动绑定两个变量target和oldTarget,并将对target所做的任何更改镜像到oldTarget。是这样吗?如果是这样的话,我有没有办法阻止这种情况?如果不是,我在做什么导致它这样做?

我假设这不是角度,这就是它的工作原理,因为$scope.oldTarget和$scope.target都是指向同一个对象的链接

var test = {foo : 'bar'};
var newTest = test;
newTest.foo = 'changed';
console.log(test);
输出为:“对象{foo:“已更改”}”


这与Angular无关,它是默认的JavaScript行为。您正在引用同一对象。如果要在不更改源的情况下对其进行修改,则需要克隆对象

看一看:


看起来您的数组元素正在被“按引用”引用。因此,创建元素的新实例,如下所示:

$scope.oldTarget = $.extend(null,data[0]);
$scope.target = $.extend(null,data[0]);

因此,您可以尝试使用angular.copy(数据)来防止这种情况。