Uncaught TypeError错误排查:无法设置undefined的属性'203'及代码问题
分析并修复「Uncaught TypeError: 无法设置undefined的属性'203'」错误
嘿,我来帮你拆解这个问题~你遇到的这个未捕获类型错误,核心原因是数组初始化错误加上索引逻辑异常,咱们一步步说:
错误原因
- 计数器
count的类型错误:你把count声明成了空数组var count = [];,但它应该是一个数字类型的计数器,初始值为0。当你用数组作为数组索引时,JavaScript会把它隐式转换为字符串(空数组转成空字符串""),后续执行count++时,数组会被强制转为数字0再自增,这种类型混乱会导致索引处理异常,最终触发无法设置undefined属性的错误。 - 潜在的变量作用域问题:你用
var声明循环变量i/j/k,在全局或函数作用域下会导致变量共享,虽然这不是直接引发当前错误的原因,但可能带来其他隐性bug。
修复后的代码
// 初始化11x11的三维空数组 var wins = []; for (var i = 0; i < 11; i++) { wins[i] = []; for (var j = 0; j < 11; j++) { wins[i][j] = []; } } // 修复:将count初始化为数字0,作为计数器 var count = 0; // 横向赢法 for (var i = 0; i < 11; i++) { for (var j = 0; j < 7; j++) { for (var k = 0; k < 5; k++) { wins[i][j + k][count] = true; } count++; } } // 纵向赢法 for (var i = 0; i < 11; i++) { for (var j = 0; j < 7; j++) { for (var k = 0; k < 5; k++) { wins[j + k][i][count] = true; } count++; } } // 斜向赢法(左上到右下) for (var i = 0; i < 7; i++) { for (var j = 0; j < 7; j++) { for (var k = 0; k < 5; k++) { wins[i + k][j + k][count] = true; } count++; } } // 可以继续添加其他赢法逻辑...
如果你的环境支持ES6+,更推荐用let声明循环变量,避免变量作用域问题:
let wins = []; for (let i = 0; i < 11; i++) { wins[i] = []; for (let j = 0; j < 11; j++) { wins[i][j] = []; } } let count = 0; // 横向赢法 for (let i = 0; i < 11; i++) { for (let j = 0; j < 7; j++) { for (let k = 0; k < 5; k++) { wins[i][j + k][count] = true; } count++; } } // 纵向赢法 for (let i = 0; i < 11; i++) { for (let j = 0; j < 7; j++) { for (let k = 0; k < 5; k++) { wins[j + k][i][count] = true; } count++; } } // 斜向赢法(左上到右下) for (let i = 0; i < 7; i++) { for (let j = 0; j < 7; j++) { for (let k = 0; k < 5; k++) { wins[i + k][j + k][count] = true; } count++; } }
验证说明
修复后,count作为数字计数器正常递增,每次给wins的三维数组赋值时,都是对已初始化的二维数组元素(空数组)添加数字索引属性,不会出现undefined的情况,也就解决了类型错误。
内容的提问来源于stack exchange,提问作者ong terry
相关产品推荐
相关产品推荐

