JavaScript中的对象值和对象数组

Objects value and object arrays in JavaScript

本文关键字:对象 数组 JavaScript      更新时间:2023-09-26

我正在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上的这一时间变化并没有反映在工厂中。这里的逻辑是什么?

编辑

我错了。控制器对象的更改也会影响工厂。我写这个最小的应用程序是为了清楚地看到它,在我的应用程序中,我一定在其他地方犯了错误。

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]);