JavaScript中的对象值和对象数组

JavaScript中的对象值和对象数组,javascript,angularjs,Javascript,Angularjs,我正在用AngularJS开发一个web应用程序。我对JavaScript中的引用感到困惑。对象上的更改何时影响其引用 例如,我的应用程序中有一个控制器。我用那个控制器上传文件,把文件信息保存在工厂里 $scope.fileArray = []; ... ... uploadFiles(file){ $scope.fileArray.push(file); .. .. //on success

我正在用AngularJS开发一个web应用程序。我对JavaScript中的引用感到困惑。对象上的更改何时影响其引用

例如,我的应用程序中有一个控制器。我用那个控制器上传文件,把文件信息保存在工厂里

   $scope.fileArray = [];
    ...
    ...
    uploadFiles(file){
         $scope.fileArray.push(file);
         ..
         ..
         //on success
         file.params = data["parameters"]; //an array of strings about file path and name
         ...
         ...
    }
在uploadFiles函数中,我将文件对象推入fileArray。然后,当我更改或向文件对象添加新属性时,我可以在fileArray中看到这些更改

var fileInfo = {
    infoArray : $scope.fileArray
}

fileFactory.keepFileInfo(fileInfo);
然后我把那个阵列放在工厂里。但$scope.fileArray的这次更改并没有反映在factory中。这里的逻辑是什么

编辑

我错了。控制器对象效果工厂中的更改也是如此。我编写这个最小的应用程序是为了清楚地看到它,在我的应用程序中,我必须在其他地方出错

var testApp = angular.module('testApp', []);

testApp.controller('TestController', function($scope, TestFactory) {
    $scope.fileArray = [];

    var files = [];
    files[0] = {
        parameters : {
            name : 'file1.txt',
            path : "user/files"
        }
    }

    $scope.fileArray.push(files[0]);

    files[1] = {
        parameters : {
            name : 'file2.txt',
            path : "user/files"
        }
    }

    $scope.fileArray.push(files[1]);

    files[2] = {
        parameters : {
            name : 'file3.txt',
            path : "user/files"
        }
    }

    $scope.fileArray.push(files[2]);

    TestFactory.setFileArray($scope.fileArray);

    files[0].parameters["name"] = "changed file name";

    console.log($scope.fileArray); //here writes "changed file name"    
    console.log(TestFactory.getFileArray()); //here writes "changed file name", too
});


testApp.factory('TestFactory', function() {
    var factory = {};

    var fileArray = [];

    factory.setFileArray = function(files) {
        fileArray = files;
    }

    factory.getFileArray = function() {
        return fileArray;
    }

    return factory;
});

我们考虑下面的例子:

var a = {};
var b = {c: a};
console.log(a === b.c);
a.d = {};
console.log(b.c);
如果您有一个对象变量,并将另一个对象的成员指定给它,那么它们具有完全相同的引用,因此如果更改其中一个,另一个也将更改。如果您对阵列执行此操作,情况也是如此:

var a = {};
var b = [a];
console.log(a === b[0]);
a.d = {};
console.log(b[0]);

我们考虑下面的例子:

var a = {};
var b = {c: a};
console.log(a === b.c);
a.d = {};
console.log(b.c);
如果您有一个对象变量,并将另一个对象的成员指定给它,那么它们具有完全相同的引用,因此如果更改其中一个,另一个也将更改。如果您对阵列执行此操作,情况也是如此:

var a = {};
var b = [a];
console.log(a === b[0]);
a.d = {};
console.log(b[0]);

请出示所有相关代码。如果您使用
$scope
定义factory数组,则似乎您没有在controller中共享它,因为factory中没有$scope请显示所有相关代码。如果您使用
$scope
定义工厂数组,似乎您并没有在controller中共享工厂数组,因为factoryGreat中没有$scope,但这与OP的工厂和控制器有何关联?@charlietfl,问得好。只要他给我们更多的信息,我的答案就会被编辑。到那时为止,我只能提供一般信息。是的,但一般信息属于问题的评论部分。如果问题不够清楚,请毫不犹豫地使用问题下的评论部分要求澄清。确保只有在回答问题时才使用答案部分。很好,但这与OP的工厂和控制器有什么联系?@charlietfl,问得好。只要他给我们更多的信息,我的答案就会被编辑。到那时为止,我只能提供一般信息。是的,但一般信息属于问题的评论部分。如果问题不够清楚,请毫不犹豫地使用问题下的评论部分要求澄清。确保只有在回答问题时才使用答案部分。