为什么数组引用号转换为STRING

Why does the array reference number switch to a STRING?

本文关键字:STRING 转换 数组 引用 为什么      更新时间:2023-09-26

我发现了我引用的问题,但我不明白现在发生了什么。数组正在正确填充,但我不知道为什么我不能拉值。然后经过一些尝试和错误,我发现在结束时,如果我关闭引号中的数组引用值,它将返回正确的值。为什么在使用整数创建引用时将其转换为字符串?

    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;
} 

JavaScript中的数组以索引0开始,而不是索引1。所以这段代码:

var payPeriodList = new Array();
payPeriodList[1] = {
    // ...
};

…将0th条目留空,同时使数组的长度为2(因为标准JavaScript数组本质上是稀疏的,因为它们根本不是真正的数组)。这样做之后,由于在后续代码中使用的是push,因此永远不会填充第一个条目。

1更改为0,或将push用于第一个条目(就像您对后续条目一样)。


旁注:用数组文字创建数组几乎总是更好,而不是用new Array():

var payPeriodList = [];

我认为您的问题是payPeriodList数组中的每个项目都是对同一对象(payPeriodItem)的引用。通过赋值数组的每次迭代都改变payPeriodItem的开始值和结束值,而不是用新的开始值和结束值创建一个新对象。因此,要解决这个问题,您只需要更改for循环中的第一行,将一个新对象分配给payPeriodList[i]。

for (var i = 2; i <= 26; i++) {
    payPeriodList[i] = {};
    /*...*/
}