开发者问题收集

有人能解释为什么我在 Javascript 中收到此错误吗?[无法读取未定义的属性‘length’]

2016-11-07
128

这是我的代码:

function isEven(num) {;
  if (num % 2 === 0) {
  return true;}
  else {
  return false;}
  }

function convertToIntegers(lst) {
  lst.split(' ');
  var len = lst.length;
  var count = 0;
  while (count < len) {
      lst[count] = parseInt(lst[count]);
      count++}
      }




function iqTest(numbers){

  var int_list = convertToIntegers(numbers);
  var e_list = [];
  var o_list = [];
  var count = 0;
  var len_int = int_list.length;
  while (count < len_int) {
      if (isEven(int_list[count]) === true) {
      e_list.push(count);}
      else if (isEven(count) === false) {
      o_list.push(count);}
      count++}
  if (e_list.length < 2 && e_list.length > 0 && o_list.length > 2) {
      return e_list[0];}
  else if (o_list.length < 2 && o_list.length > 0 && e_list.length > 2) {
      return o_list[0];}
      }

每次运行它时,我都会收到此错误,提示“TypeError:无法读取 iqTest 中未定义的属性‘length’”。有人能向我解释如何修复此错误吗?我不明白为什么我的代码中任何对象都是未定义的。我所做的每个 var 声明都是完整的。我认为只有当我编写了类似“var a”的内容而没有定义它时,才会出现未定义的情况。

3个回答

Tomer W 和 Patrick Evans 是对的。更改您的辅助函数

function convertToIntegers(lst) {
  lst = lst.split(' ');
  var len = lst.length;
  var count = 0;
  while (count < len) {
    lst[count] = parseInt(lst[count]);
    count++;
  }
  return lst;
}

这样,您就可以存储拆分的结果,然后在完成后返回数组。

话虽如此,这个函数不是必需的。查看内置数组函数 map

Jake
2016-11-07

这个非常简单!
在这些情况下,您需要追溯值。

  1. 您在 iqTest() 中的行 var len_int = int_list.length;

  2. 中使用 .length
  3. int_list 的最后一次赋值位于行 var int_list = convertToIntegers(numbers);

  4. 瞥见 convertToIntegers(numbers) 没有显示 return 语句。

因此得出结论:
convert2Integers() 不会将任何内容返回到 int_list
然后您使用 int_list.length; undefined

看来您希望从 convert2Integers() 返回 lst

function convertToIntegers(lst) {
  lst = lst.split(' '); // NOTICE CHANGE, + create a different list!
  var len = lst.length;
  var count = 0;
  while (count < len) {
    lst[count] = parseInt(lst[count]);
    count++
  }
  return lst; //THIS LINE was Missing!
}
Tomer W
2016-11-07

要扩展@Patrick Evans 的评论,您需要保存拆分的结果,然后将其用于您的 while 循环。顺便提一下,您知道循环的迭代次数,因此您可以使用 for 循环。

function convertToIntegers(lst) {
//lst.split(' ');
var lst_array = lst.split(' ');
var len = lst_array .length;
var count = 0;
while (count < len) {
  lst_array[count] = parseInt(lst_array[count]);
  count++}
  }
//
//for loop code
//
//for(i=0;i<lst_array.length;i++){
//  lst_arry[i] = parseInt(lst_array[i]);
//}
Wesley
2016-11-07