在javascript中,(for … in)和(for …)之间有什么区别?

我知道什么是for... in循环(它迭代关键),但第一次听到for... of (它迭代的价值)。 我for... of循环感到困惑。 我没有得到adject。 这是下面的代码:

 var arr = [3, 5, 7]; arr.foo = "hello"; for (var i in arr) { console.log(i); // logs "0", "1", "2", "foo" } for (var i of arr) { console.log(i); // logs "3", "5", "7" //it is does not log "3", "5", "7","hello" } 

我得到的是对属性值的迭代。 那为什么不logging(返回) "3", "5", "7","hello"而不是"3", "5", "7" ? 但是for... in循环遍历每个键(“0”,“1”,“2”,“foo”)。 这里for... in循环也遍历foo键。 但是对于没有迭代foo属性的价值,即"hello"为什么这样呢?

长话短说:

在这里我安慰for... of循环。 应该logging"3", "5", "7","hello"但在这里logging"3", "5", "7" 。 为什么?

示例链接

for in循环通过对象的枚举属性名称。

for of (ES6中的新增function)确实使用了一个特定于对象的迭代器 ,并对由此生成的值进行循环。

在你的例子中, 数组迭代器确实会产生数组中的所有值(忽略非索引属性)。

我find了一个完整的答案: https : //www.typescriptlang.org/docs/handbook/iterators-and-generators.html (虽然它是用于types脚本,这也是相同的JavaScript)

for..offor..in语句都迭代列表; 迭代的值是不同的, for..in返回被迭代的对象的键列表,而for..of返回被迭代对象的数字属性的值列表。

这里有一个例子来certificate这个区别:

 let list = [4, 5, 6]; for (let i in list) { console.log(i); // "0", "1", "2", } for (let i of list) { console.log(i); // "4", "5", "6" } 

另一个区别是,…在任何对象上运行。 它作为一种方法来检查这个对象的属性。 另一方面,它主要关注可迭代对象的值。 Map和Set等内置对象implement Symbol.iterator属性,允许访问存储的值。

 let pets = new Set(["Cat", "Dog", "Hamster"]); pets["species"] = "mammals"; for (let pet in pets) { console.log(pet); // "species" } for (let pet of pets) { console.log(pet); // "Cat", "Dog", "Hamster" } 

for-in语句以任意顺序迭代对象的可枚举属性。

循环将遍历对象本身的所有可枚举属性,而对象inheritance自其构造函数的原型

你可以把它看作“for in”,基本上迭代并列出所有的键。

 var str = 'abc'; var arrForOf = []; var arrForIn = []; for(value of str){ arrForOf.push(value); } for(value in str){ arrForIn.push(value); } console.log(arrForOf); // ["a", "b", "c"] console.log(arrForIn); // ["0", "1", "2", "formatUnicorn", "truncate", "splitOnLast", "contains"]