Apps Script数组未按预期工作:子数组引用导致结果异常
数组元素被意外覆盖的问题解决
问题现象
调试时发现,父数组thisArray没有执行直接赋值操作,所有元素却都变成了最后一次循环的结果:
- 预期输出:
["Pass # 1","this is some data"] ["Pass # 2","this is some data"] ["Pass # 3","this is some data"]
- 实际输出:
["Pass # 3","this is some data"] ["Pass # 3","this is some data"] ["Pass # 3","this is some data"]
复现代码
function debugThis(){ var thisArray = []; var thisRow = []; var pass = 0; for (var i = 0; i < 3; i++) { pass++; thisRow[0] = 'Pass # ' + pass; thisRow[1] = 'This is some data'; thisArray[i] = thisRow; } }
问题根源
JavaScript中数组属于引用类型,你只创建了一个thisRow数组实例。每次循环只是修改这个实例里的元素值,然后把它的引用存入thisArray。这就导致thisArray的三个元素其实指向同一个数组对象,最后一次循环修改了这个对象的内容,所有引用它的位置自然都会显示最新值。
修复方法
每次循环时新建一个thisRow数组,不要复用同一个实例:
function debugThis(){ var thisArray = []; var pass = 0; for (var i = 0; i < 3; i++) { pass++; // 每次循环创建新数组 var thisRow = []; thisRow[0] = 'Pass # ' + pass; thisRow[1] = 'This is some data'; thisArray[i] = thisRow; } }
也可以用数组字面量简化写法,更直观:
function debugThis(){ var thisArray = []; var pass = 0; for (var i = 0; i < 3; i++) { pass++; thisArray[i] = ['Pass # ' + pass, 'This is some data']; } }
内容的提问来源于stack exchange,提问作者glenn
相关产品推荐
相关产品推荐

