已验证的属性类型存在但仍会出错?

时间:2017-05-31 13:37:58

标签: javascript properties undefined

我正在

  

TypeError:无法读取未定义的属性“length”

在下面的代码上。具体而言,错误与newStr[i].length命令有关。正如您所看到的(已注释掉)我测试过并且可以确认newStr[1]存在:

function findLongestWord(str) {
  var expression = /\w+/g;
  var newStr = str.match(expression);
  // return newStr[1].length;
  var longestWord = "";
  for (var i = 1; i < (newStr.length + 1); i++) {
    if (newStr[i].length > newStr[i - 1].length) {
      longestWord = newStr[i];
    } else {
      longestWord = longestWord;
    }
  }
  return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你的循环是一个接一个。输出还不正确(输出&#39;懒惰&#39;)。您需要与longestWord进行比较,而不是前一个单词。

function findLongestWord(str) {
  var expression = /\w+/g;
  var newStr = str.match(expression);
  // return newStr[1].length;
  var longestWord = "";
  for (var i = 1; i < newStr.length; i++) { // fixed off-by-one
    if (newStr[i].length > longestWord.length) { // compare to longestWord
      longestWord = newStr[i];
    } else {
      longestWord = longestWord;
    }
  }
  return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));

提供"jumped"

答案 1 :(得分:0)

for (var i = 1; i < (newStr.length + 1); i++) {

newStr.length将是e。 G。 4,然后我将运行最多4,但newStr [4]不存在。所以它也没有长度。

你可以把整个东西缩短一点:

function findLongestWord(str) {
  return str.split(" ").reduce((longest,curr)=>curr.length>longest.length?curr:longest,"");
}

答案 2 :(得分:0)

问题在于您如何编制索引。执行i < newStr.length + 1与执行i <= newStr.length相同。由于所有内容均为0索引,因此您尝试访问newStr[newStr.length]处的内容,但最后一个元素位于newStr[newStr.length - 1]

这里有正确索引的代码:

&#13;
&#13;
function findLongestWord(str) {
  var expression = /\w+/g;
  var newStr = str.match(expression);
  var longestWord = "";
  for (var i = 0; i < newStr.length; i++) {
    if (newStr[i].length > newStr[i - 1].length) {
      longestWord = newStr[i];
    } else {
      longestWord = longestWord;
    }
  }
  return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
&#13;
&#13;
&#13;

但是,你的逻辑也存在缺陷。如果您想找到最长的单词,您不希望将每个单词与前一个单词进行比较。你想比较你到目前为止发现的最长单词与你找到的每个单词。

&#13;
&#13;
function findLongestWord(str) {
  var expression = /\w+/g;
  var newStr = str.match(expression);
  var longestWord = "";
  for (var i = 0; i < newStr.length; i++) {
    /***********************************/
    if (newStr[i].length > longestWord.length) {
      longestWord = newStr[i];
    }
    /***********************************/
  }
  return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
&#13;
&#13;
&#13;