javascript数组填充得很奇怪
我正在angular中编写一个应用程序,并创建一个名为Workbook的自定义服务数组,每个自定义服务都有一个名为Views的自定义服务数组。我用一个简单的for循环填充数组,但出于某种原因,这会产生意想不到的结果: 第一次迭代后,数组中有一个工作簿:javascript数组填充得很奇怪,javascript,arrays,debugging,angularjs,Javascript,Arrays,Debugging,Angularjs,我正在angular中编写一个应用程序,并创建一个名为Workbook的自定义服务数组,每个自定义服务都有一个名为Views的自定义服务数组。我用一个简单的for循环填充数组,但出于某种原因,这会产生意想不到的结果: 第一次迭代后,数组中有一个工作簿: 工作簿1 在第二本之后,有两本工作手册标题为工作簿2:工作簿2工作簿2 第三个之后:工作簿3工作簿3工作簿3 等等。这怎么会发生?以下是创建工作簿并将其添加到数组的代码的简化版本: for (var i = 0; i < 3; i++) {
工作簿1
在第二本之后,有两本工作手册标题为工作簿2:工作簿2
工作簿2
第三个之后:工作簿3
工作簿3
工作簿3
等等。这怎么会发生?以下是创建工作簿并将其添加到数组的代码的简化版本:
for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));
for (var j = 0; j <2; j++ ) {
var view = View;
view.setTitle("view " + (j + 1));
workbook.addView(view);
}
workbooks[i] = workbook;
//this next for loop can be used to print the array as described
for (var k = 0; k < workbooks.length; k++) {
console.log(workbooks[k].getTitle());
}
}
return workbooks;
for(变量i=0;i<3;i++){
var工作簿=工作簿;
工作簿.setTitle(“工作簿”+(i+1));
对于(var j=0;j井,第一个问题:
for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));
for(变量i=0;i<3;i++){
var工作簿=工作簿;
工作簿.setTitle(“工作簿”+(i+1));
每次通过此循环,您都会重新创建变量“工作簿”,并将其命名为“工作簿X”
但看起来您并不是每次都创建一个新工作簿,而是重复使用相同的引用,因此每个工作簿最终都只是对同一对象的引用
下一次遍历循环时,您只需重新指定此引用的标题,并且它们都在更新
试试这个,看看它的反应如何
var workbook; // Just cleaner, avoids re-declaring the variable
for (var i = 0; i < 3; i++) {
workbook = new Workbook; // avoids re-referencing the same Workbook
workbook.setTitle("workbook " + (i + 1));
for (var j = 0; j <2; j++ ) {
var view = View;
view.setTitle("view " + (j + 1));
workbook.addView(view);
}
workbooks[i] = workbook;
//this next for loop can be used to print the array as described
for (var k = 0; k < workbooks.length; k++) {
console.log(workbooks[k].getTitle());
}
}
return workbooks;
var工作簿;//只需清理,即可避免重新声明变量
对于(变量i=0;i<3;i++){
工作簿=新工作簿;//避免重新引用同一工作簿
工作簿.setTitle(“工作簿”+(i+1));
对于(var j=0;j井,第一个问题:
for (var i = 0; i < 3; i++) {
var workbook = Workbook;
workbook.setTitle("workbook " + (i + 1));
for(变量i=0;i<3;i++){
var工作簿=工作簿;
工作簿.setTitle(“工作簿”+(i+1));
每次通过此循环,您都会重新创建变量“工作簿”,并将其命名为“工作簿X”
但看起来您并不是每次都创建一个新工作簿,而是重复使用相同的引用,因此每个工作簿最终都只是对同一对象的引用
下一次遍历循环时,您只需重新指定此引用的标题,并且它们都在更新
试试这个,看看它的反应如何
var workbook; // Just cleaner, avoids re-declaring the variable
for (var i = 0; i < 3; i++) {
workbook = new Workbook; // avoids re-referencing the same Workbook
workbook.setTitle("workbook " + (i + 1));
for (var j = 0; j <2; j++ ) {
var view = View;
view.setTitle("view " + (j + 1));
workbook.addView(view);
}
workbooks[i] = workbook;
//this next for loop can be used to print the array as described
for (var k = 0; k < workbooks.length; k++) {
console.log(workbooks[k].getTitle());
}
}
return workbooks;
var工作簿;//只需清理,即可避免重新声明变量
对于(变量i=0;i<3;i++){
工作簿=新工作簿;//避免重新引用同一工作簿
工作簿.setTitle(“工作簿”+(i+1));
对于(var j=0;j您不是将第i个工作簿分配给数组中的每个点,而是将相同的工作簿分配给每个点,然后更新标题。您需要
var workbook = Workbook;
进入这个
var workbook = new Workbook;
您不是将第i个工作簿分配给数组中的每个点,而是将相同的工作簿分配给每个点,然后更新标题。您需要
var workbook = Workbook;
进入这个
var workbook = new Workbook;
在工厂实现中,每次工厂调用都需要返回新对象
GATapp.factory('Workbook', function () {
return function () {
var title;
var views = [];
this.getTitle = function () {
return title;
}
this.setTitle = function (newTitle) {
title = newTitle;
}
this.getViews = function () {
return views;
}
this.addView = function (newView) {
views.push(newView);
}
this.getView = function (i) {
return views[i].getTitle();
}
};
});
并在使用工厂时创建新对象
var workbook = new Workbook();
请看一看。在factory的实现中,每个factory调用都需要返回新对象
GATapp.factory('Workbook', function () {
return function () {
var title;
var views = [];
this.getTitle = function () {
return title;
}
this.setTitle = function (newTitle) {
title = newTitle;
}
this.getViews = function () {
return views;
}
this.addView = function (newView) {
views.push(newView);
}
this.getView = function (i) {
return views[i].getTitle();
}
};
});
并在使用工厂时创建新对象
var workbook = new Workbook();
请看一看。它们都是相同的对象,可能您在var workbook=workbook;
?处缺少了一个new
,或者缺少了一个对象。创建(工作簿)
如果工作簿
是一个看起来像它的对象。它们都是同一个对象,可能您在var Workbook=Workbook;
?处缺少一个新的
,或者缺少一个对象。创建(工作簿)
如果工作簿
是一个看起来像它的对象。哦,你是对的,我需要在我的工厂返回一个对象。谢谢你的帮助!哦,你是对的,我需要在我的工厂返回一个对象。谢谢你的帮助!谢谢你对我的代码的帮助!我没有意识到我一直在引用同一个对象t、 :)没问题……javascript在某些地方有点奇怪。它是一种非常灵活和强大的语言,但不要让语法蒙蔽了你;有很多地方javascript在思想和行为上都不像标准的C风格语言。我可能会强烈推荐《javascript:好的部分》一书…这有助于您理解JavaScript对对象的“思考”方式。谢谢,我来看看!我一直在努力寻找一本好书来了解JavaScript的全貌。感谢您对我的代码的帮助!我没有意识到我一直在引用同一个对象。:)这不是问题……javascript在某些地方有点奇怪。它是一种非常灵活和强大的语言,但不要让语法蒙蔽了你;有很多地方javascript并不认为或表现得像标准的C风格语言。我可能强烈推荐《javascript:好的部分》一书…这有助于您理解JavaScript对对象的“思考”方式。谢谢,我来看看!我一直在努力寻找一本好书,以了解JavaScript的全貌。