JavaScript函数报错Cannot read property 'length' of undefined,arr[i]未定义的原因是什么?
为啥arr[i]会变成undefined?
嘿,这个错误的根源其实是数组循环的边界条件写错了,咱们来掰扯清楚:
核心问题:循环越界了
JavaScript里数组的索引是从0开始的,比如你传入的arr是[[1,2,3],[4,5,6],[7,8,9,0]],它的length是3,有效的索引只有0、1、2这三个。
但你第一个for循环的条件写的是:
for (i = 0; i <= arr.length; i++) {
这意味着i会从0一直循环到3(因为3 <= 3是成立的),当i等于3的时候,arr[3]根本不存在——数组里没有第4个元素,所以它的值就是undefined。这时候你再去访问arr[i].length,自然就会抛出Cannot read property 'length' of undefined的错误啦!
怎么修复?
把第一个循环的终止条件改成小于数组长度,也就是:
for (let i = 0; i < arr.length; i++) {
这样i只会跑到2,不会触及不存在的索引3,arr[i]就始终是有效的子数组了。
顺便提两个小坑(避免后续踩雷)
- 第二个嵌套循环也有同样的问题:
j <= arr[i].length要改成j < arr[i].length,不然也会访问到子数组的undefined索引。 - 变量
i和j没有用let声明,会变成全局变量,最好加上let,避免污染全局作用域。
内容的提问来源于stack exchange,提问作者Harvey Johnson
相关产品推荐
相关产品推荐

