未捕获的TypeError:items不可迭代。

6
我的理解是,for...in循环是为了在Javascript中迭代对象而设计的。可以参考这篇文章这篇文章
以以下示例为例,这会在我的控制台中返回“Uncaught TypeError:items is not iterable”错误信息。

var text = {
  name: "Coptic",
  ranges: [[994, 1008], [11392, 11508], [11513, 11520]],
  direction: "ltr",
  year: -200,
  living: false,
  link: "https://en.wikipedia.org/wiki/Coptic_alphabet"
};

function dominantDirection(items) {
  for (let item of items) {
    if (item.direction === 'ltr') {
      return 'ltr';
    } else {
      return 'rtl';
    }
  }
}

console.log(dominantDirection(text));

如果我把对象包装在一个数组[]中,它就能正常工作。然而,我的第二个例子按预期工作。

var object1 = {a: 1, b: 2, c: 3};
var string1 = "";

function loopObj() {
  for (var property1 in object1) {
    console.log(string1 = string1 + object1[property1]);
  }
}

console.log(loopObj());

为什么第一个示例需要一个数组,而第二个示例不需要呢?

text 不是一个数组的例子! - Ele
3
你的第一个代码示例使用的是 for ... of 而不是 for ... in - Pointy
这两个代码片段完全做了不同的事情。第一个是遍历对象集合,并在检查集合中第一个对象的方向后立即返回。第二个代码片段是迭代传入对象的每个属性。 - Marie
在您的第一个示例中,您不必迭代text对象以检索方向(您基本上正在执行两个级别的迭代)。只需通过items.direction访问方向即可。 - Terry
@Pointy 哇,我感到有点傻。谢谢! - London804
1个回答

9
在你的第一个例子中,你使用了for..of语句,但它不能用于对象,只能用于字符串和数组。要遍历一个对象,请使用for..in语句或使用Object.keys()将对象的键获取到一个数组中。
使用Object.keys()的示例:

const text = {
  name: "Coptic",
  ranges: [[994, 1008], [11392, 11508], [11513, 11520]],
  direction: "ltr",
  year: -200,
  living: false,
  link: "https://en.wikipedia.org/wiki/Coptic_alphabet"
};

for (let key of Object.keys(text)) {
  
  console.log(`${key}: ${text[key]}`);
}

或者您也可以使用新的Object.entries()来获取键和值,如下所示:

const text = {
  name: "Coptic",
  ranges: [[994, 1008], [11392, 11508], [11513, 11520]],
  direction: "ltr",
  year: -200,
  living: false,
  link: "https://en.wikipedia.org/wiki/Coptic_alphabet"
};

for (let [key, value] of Object.entries(text)) {
  
  console.log(`${key}: ${value}`);
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接