使用length属性时出现「TypeError: Cannot read property 'length' of undefined」错误的原因
问题分析与修复方案
错误原因
你遇到的TypeError: Cannot read property 'length' of undefined是因为循环逻辑的边界错误:
- 当
for循环的条件是i < arr.length时,i会遍历到数组最后一个元素的索引(比如示例数组长度为3,i会到2)。 - 此时
i+1等于数组的长度(3),而数组的索引范围是0到length-1,所以arr[i+1]是undefined,尝试读取它的length属性就会抛出错误。
另外你的代码还有两个冗余/不合理的地方:
[arr[i]] = [arr[i+1]]这行交换数组元素的代码完全没必要,我们只需要记录最长单词,不需要修改原数组。- 初始的
longest未赋值,如果传入只有一个单词的短语,循环不会执行,最终返回undefined,不符合预期。
修复后的代码(基础循环版)
const longestWord = (phrase) => { const arr = phrase.split(" "); // 处理空输入的极端情况 if (arr.length === 0) return ""; // 初始化最长单词为数组第一个元素 let longest = arr[0]; // 从第二个元素开始遍历比较 for (let i = 1; i < arr.length; i++) { if (arr[i].length > longest.length) { longest = arr[i]; } } return longest; } let longWhich = longestWord("Web Development Tutorial"); console.log(longWhich); // 输出 "Development"
更简洁的实现(reduce方法)
如果你想让代码更简洁,可以用数组的reduce方法直接迭代找出最长单词:
const longestWord = (phrase) => { const arr = phrase.split(" "); // reduce迭代,每次比较当前元素和已记录的最长单词 return arr.reduce((longest, current) => current.length > longest.length ? current : longest, "" // 初始值设为空字符串,兼容空输入 ); } let longWhich = longestWord("Web Development Tutorial"); console.log(longWhich); // 输出 "Development"
内容的提问来源于stack exchange,提问作者Normye
相关产品推荐
相关产品推荐

