为什么 += 操作中的变量会根据其定义方式产生混合结果?

Why does a variable in += operation with concatenation yield mixed results based on how it's defined?

当我声明变量并在下一条语句中通过连接其他变量和文本通过加号等于 (+=) 运算符赋值时,我收到存储在我的对象中的所有数据。但是,它前面有 'undefined'。为了消除变量的初始未定义状态,我在串联之前定义了它,但是,这会破坏我的加号运算符,截断结果。

     for (var j = 0; j < itemResponses.length; j++) {
        var itemResponse = itemResponses[j]; 
        var responseTitle = itemResponse.getItem().getTitle();
        var responseAnswer = itemResponse.getResponse();
        var responseComplete;                // Inserts undefined at start of log
     // var responseComplete = "";           // Breaks += operation
     // var responseComplete = new String(); // Breaks += operation
        responseComplete += (responseTitle + ": " + responseAnswer + "; ");
      }
      Logger.log(stringData);

记录 var responseComplete;

[16-09-15 15:38:02:256 PDT] undefinedName: 名称;
会员号:0000;
日期:2016-09-0909:00;
时长:00:00:09;
// **** 在 log

的头部插入 'undefined'

记录 var responseComplete = new String();

[16-09-15 15:39:02:610 PDT] 持续时间:00:00:09;
// **** 中断 += 运算符。

记录 var responseComplete = "";

[16-09-15 15:39:42:010 PDT] 持续时间:00:00:09;
// **** 中断 += 运算符。

非常感谢深入了解我对语言的误解。

(此项目是在 Google Apps 脚本编辑器中编写和执行的)

最后两个场景很容易解释:您在每个循环中将 responseComplete 重置为一个空字符串,因此 += 没有多大意义,因为您总是连接到一个空字符串。

responseComplete += abc

等于说

responseComplete = responseComplete + abc

并且由于在每个循环中都有 responseComplete = "",因此

responseComplete = "" + abc = abc

第一种情况有点棘手。由于 var 是在解析时计算的,而不是 运行 时,这与在 for 循环外声明变量相同,并且由于它被声明但未分配任何值,因此第一次等于 undefined

responseComplete = responseComplete + ABC

responseComplete = undefinedABC

如果 responseComplete 被保留,第二个循环和向前的值。

responseComplete = responseComplete + _nextValue

responseComplete = undefinedABC + _nextValue = undefinedABC_nextValue