为什么默认情况下对象不可迭代?
我一直看到与迭代对象有关的问题,常见的解决方案是迭代对象的属性并以这种方式访问对象中的值.这似乎很常见,它让我想知道为什么对象本身不可迭代.
for...of
默认情况下,像ES6 这样的语句很适合用于对象.因为这些功能仅适用于不包含{}
对象的特殊"可迭代对象" ,所以我们必须通过箍来使这个对我们想要使用它的对象起作用.
for ... of语句创建一个循环迭代可迭代对象 (包括Array,Map,Set,arguments对象等)......
例如,使用ES6 生成器功能:
var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
for (let [key, value] of entries(example)) {
console.log(key);
console.log(value);
for (let [key, value] of entries(value)) {
console.log(key);
console.log(value);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在Firefox(支持ES6)中运行代码时,上面按照我期望的顺序正确记录数据:
默认情况下,{}
对象不可迭代,但为什么?缺点是否超过了可迭代对象的潜在好处?与此相关的问题是什么?
此外,由于{}
对象是从"阵列状"集合和"可迭代的对象",如不同NodeList
,HtmlCollection
以及arguments …
假设你有一个类似数组的Javascript ES6 Iterable,你事先知道它的长度是有限的,将它转换为Javascript数组的最佳方法是什么?
这样做的原因是许多js库(如下划线和lodash)仅支持Arrays,因此如果您希望在Iterable上使用它们的任何函数,则必须首先将其转换为Array.
在python中,您可以使用list()函数.在ES6中是否有相同的东西?
使用Array.from(document.querySelectorAll('div'))
或是否有一些区别[...document.querySelectorAll('div')]
?
这是一个例子:
let spreadDivArray = [...document.querySelectorAll('div')];
console.log(spreadDivArray);
let divArrayFrom = Array.from(document.querySelectorAll('div'));
console.log(divArrayFrom);
Run Code Online (Sandbox Code Playgroud)
在console.log()
将记录相同的结果.
有任何性能差异吗?