JavaScript报错Uncaught TypeError: Cannot set properties of undefined如何解决?
解决"Uncaught TypeError: Cannot set properties of undefined (setting '1')"错误
错误原因
- 数组层级初始化错误:你初始化的
arry在循环push后是[[[[]]], [], []],当turn为1或2时,arry[turn]是空数组,访问arry[turn][i1]会得到undefined,此时尝试给undefined[i2]赋值就会触发报错。 - 数组扩展位置错误:当
i2满5个元素时,你执行arry.push([])是给最外层数组添加元素,而不是给当前turn对应的二维数组添加新的行(一维数组),导致后续i1++后,arry[turn][i1]不存在,同样会出现undefined。
修复方案
- 修正初始化逻辑:给
arry的每个元素都初始化一个二维数组结构,确保arry[turn]始终是一个二维数组。 - 修正数组扩展逻辑:当需要添加新行时,给当前
turn对应的二维数组(arry[turn])push空数组,而不是最外层数组。
修改后的完整代码
var arry = [[[[]]]], i1 = 0, i2 = 0, intervalRate = 1000, turn = 0, a = 10, b = 5; // 初始化另外两个二维数组,而非空数组 for(i = 0; i < 2; i++) arry.push([[]]); setInterval(() => { // 防御性检查:确保当前turn对应的二维数组的第i1行存在 if (!arry[turn][i1]) { arry[turn].push([]); } arry[turn][i1][i2] = [a, b]; i2++; if(i2 % 5 === 0 && i2 !== 0){ i1++; i2 = 0; // 给当前二维数组添加新行,对应i1++后的存储位置 arry[turn].push([]); } turn++; if(turn === 3) turn = 0; a += 5; b += 5; }, intervalRate);
关键说明
- 初始化时用
arry.push([[]]),保证每个arry[turn]都是包含空一维数组的二维数组,确保第一次赋值arry[turn][0][0]有效。 - 添加
if (!arry[turn][i1]) { arry[turn].push([]); }做防御性检查,避免极端情况下i1超出当前行数导致的报错。 - 将
arry.push([])改为arry[turn].push([]),确保新行添加到当前操作的二维数组中,匹配i1++后的存储需求。
内容的提问来源于stack exchange,提问作者erselbal
相关产品推荐
相关产品推荐

