JavaScript中的对象值和对象数组
我正在用AngularJS开发一个web应用程序。我对JavaScript中的引用感到困惑。对象上的更改何时影响其引用 例如,我的应用程序中有一个控制器。我用那个控制器上传文件,把文件信息保存在工厂里JavaScript中的对象值和对象数组,javascript,angularjs,Javascript,Angularjs,我正在用AngularJS开发一个web应用程序。我对JavaScript中的引用感到困惑。对象上的更改何时影响其引用 例如,我的应用程序中有一个控制器。我用那个控制器上传文件,把文件信息保存在工厂里 $scope.fileArray = []; ... ... uploadFiles(file){ $scope.fileArray.push(file); .. .. //on success
$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,问得好。只要他给我们更多的信息,我的答案就会被编辑。到那时为止,我只能提供一般信息。是的,但一般信息属于问题的评论部分。如果问题不够清楚,请毫不犹豫地使用问题下的评论部分要求澄清。确保只有在回答问题时才使用答案部分。