Javascript 为什么数组引用号会切换为字符串?
我发现了引用的问题,但我不明白现在发生了什么。数组已正确填充,但我不明白为什么无法提取值。然后,经过一些尝试和错误,我在最后发现,如果我用引号关闭数组引用值,它将返回正确的值。为什么在使用整数创建引用时将其转换为字符串Javascript 为什么数组引用号会切换为字符串?,javascript,google-apps-script,Javascript,Google Apps Script,我发现了引用的问题,但我不明白现在发生了什么。数组已正确填充,但我不明白为什么无法提取值。然后,经过一些尝试和错误,我在最后发现,如果我用引号关闭数组引用值,它将返回正确的值。为什么在使用整数创建引用时将其转换为字符串 function initPPArray(year) { var beginningOfYear = new Date('January 1, 2014'); var dayOffset = (beginningOfYear.getDay() + 6) % 7;
function initPPArray(year) {
var beginningOfYear = new Date('January 1, 2014');
var dayOffset = (beginningOfYear.getDay() + 6) % 7;
var beginningOfPP = new Date(beginningOfYear.getFullYear(), beginningOfYear.getMonth(), beginningOfYear.getDate() - dayOffset);
var payPeriodList = [];
payPeriodList[1] = {};
payPeriodList[1].start = beginningOfPP;
payPeriodList[1].end = new Date(beginningOfPP.getFullYear(), beginningOfPP.getMonth(), beginningOfPP.getDate() + 13);
Logger.log('beginningOfPP: ' + beginningOfPP);
var txtStart = getMonthString(payPeriodList[1].start) + ", " + payPeriodList[1].start.getDate();
var txtEnd = getMonthString(payPeriodList[1].end) + ", " + payPeriodList[1].end.getDate();
Logger.log("PP 1: " + txtStart + " - " + txtEnd);
for (var i = 2; i <= 26; i++) {
payPeriodList[i] = {};
payPeriodList[i].start = new Date(payPeriodList[i-1].end.getFullYear(), payPeriodList[i-1].end.getMonth(), payPeriodList[i-1].end.getDate() + 1);
payPeriodList[i].end = new Date(payPeriodList[i].start.getFullYear(), payPeriodList[i].start.getMonth(), payPeriodList[i].start.getDate() + 13);
var txtStart = getMonthString(payPeriodList[i].start) + ", " + payPeriodList[i].start.getDate();
var txtEnd = getMonthString(payPeriodList[i].end) + ", " + payPeriodList[i].end.getDate();
Logger.log("PP: " + i + ": " + txtStart + " - " + txtEnd);
}
// This returns the proper value.. when no quotes are used it returns
// the last date of the loop "Dec 15,2014"
Logger.log("Random Value: " + payPeriodList["6"].start)
return payPeriodList;
}
函数初始数组(年){
var BeginingOfyear=新日期(“2014年1月1日”);
var dayOffset=(beginingofyear.getDay()+6)%7;
var beginningOfPP=新日期(beginningOfYear.getFullYear()、beginningOfYear.getMonth()、beginningOfYear.getDate()-dayOffset);
var payPeriodList=[];
payPeriodList[1]={};
payPeriodList[1]。开始=开始FPP;
payPeriodList[1]。end=新日期(beginningOfPP.getFullYear()、beginningOfPP.getMonth()、beginningOfPP.getDate()+13);
Logger.log('beginingofpp:'+beginingofpp);
var txtStart=getMonthString(payPeriodList[1]。start)+“,”+payPeriodList[1]。start.getDate();
var txtEnd=getMonthString(payPeriodList[1].end)+“,“+payPeriodList[1].end.getDate();
Logger.log(“第1页:“+txtStart+”-“+txtEnd”);
对于JavaScript中的(var i=2;i数组,以索引0
开始,而不是索引1
。因此此代码:
var payPeriodList = new Array();
payPeriodList[1] = {
// ...
};
…将0th
项留空,同时使数组的长度2
(因为标准JavaScript数组本身就是稀疏的,因为它们本身就是稀疏的)。一旦这样做了,由于在后续代码中使用了push
,因此第一个条目永远不会填充
将1
更改为0
,或使用push
作为第一个条目(与后续条目相同)
旁注:使用数组文字创建数组几乎总是更好的,而不是new array()
:
我认为您的问题在于payPeriodList数组中的每个项目都是对同一对象(payPeriodItem)的引用。通过分配数组的每次迭代都会更改payPeriodItem的起始值和结束值,而不是创建具有新起始值和结束值的新对象。因此,要解决此问题,您只需更改for循环中的第一行即可将新对象分配给payPeriodList[i]
for (var i = 2; i <= 26; i++) {
payPeriodList[i] = {};
/*...*/
}
for(var i=2;我使用了数组文本,但通过搜索,我尝试了几种变体。我将尝试清理代码并使用您的建议。我从“1”开始使用payPeriodList因为我将使用索引作为相应的付款期编号。这不是您要问的,但您可以用一行替换23行switch
语句:var dayOffset=(beginingofyear.getDay()+6)%7;
当然有用。谢谢你的提示。这是我的第一个编程项目,所有东西都是自学的。我会采纳我能得到的任何建议。这给了我同样的结果。数组正在填充。我只是不知道数组索引为什么会变成字符串。如果我这样做,我只能回忆一个值:payPeriodList(“6”)你确定数组正在填充吗?我已经复制了你的代码并放置了console.log(payPeriodList[“6”]==payPeriodList[6])在return语句之前,它的计算结果为true。我不知道为什么一个人可以使用stringed int访问数组元素,但我不知道如何为这两个元素获取不同的值。现在可以这样做了。我不明白。昨晚我在这个问题上纠结了几个小时,除非数组索引是字符串,否则我无法获取正确的值。你知道吗r建议很好用,我又回到了原来的建议,也很好用。Wtf?
for (var i = 2; i <= 26; i++) {
payPeriodList[i] = {};
/*...*/
}