开发者问题收集

for 循环行为“TypeError:无法读取未定义的属性‘length’”

2019-01-05
2778

我没有在已经提出的此类问题的答复中找到答案。 我不明白,当我的 for 循环包含此条件时,为什么控制台会抛出此错误“ TypeError:无法读取未定义的属性‘length’”

  for (let i = 0; i <= res.length; i++) {
    arr.push(res[i].length);
  }

没有等号 它有效。

我不明白为什么。我以为设置 i=1 会起作用。但事实并非如此。 有人可以解释一下,为什么我在给定条件时会出错吗?

i>**=**res.length; (with equal sign)

完整代码

function findLongestWordLength(str) {
  var arr = [];
  var res = str.split(" ");
  for (let i = 1; i < res.length; i++) {
    arr.push(res[i].length);
  }

  return Math.max(...arr);
}

findLongestWordLength("May the force be with you");

谢谢,新年快乐。

3个回答

因为数组的索引始终为长度 - 1。

您可以这样说。假设您有一个长度为 2 的数组

const ar = ["a", "b"]

如果您检查此数组的长度,它将显示 2 ,但此数组的最大索引仅为 1

因此,当您循环遍历数组的长度时,它会上升到索引 2,并且 res[2]未定义

Shubham Shukla
2019-01-05

基本上, Array 的索引都是从零开始的。

如果循环直到长度,最后一个索引就是 1。

array = [1, 2, 3] // length === 3

如果循环直到 3

array[3]

您将得到 undefined ,或者如果元素应该是一个对象,那么您将得到上面提到的错误。

Nina Scholz
2019-01-05

在 JavaScript 中,数组以零为基础。

例如:如果数组 var arr = [10,20,30] 中有 3 个数字,则这些数字的索引将为 0 1, 2 ,即,您可以使用 arr[0] 访问 10 ,使用 arr[1] 访问 20 ,使用 arr[2] 访问 30

请注意,此数组的长度将为 3。因此,当您在循环中从 0 迭代到长度时,您会多一个索引,因此会得到 undefined 。在循环中,从 0 到 <= res.length - 1 或从 0 到 < res

codelyzer
2019-01-05