for...of
循环可以遍历属性值,它是在ECMAScript 2015中添加到JavaScript规范中的一个特性。
考虑到这个问题的背景是Firefox插件,问题不在于其他浏览器是否可用或何时可用。问题在于ECMAScript 2015特性何时添加到Firefox中,以及使用它可能导致的向后兼容性限制。
它在
Firefox 13中添加到Firefox。因此,使用它将导致限制您的附加组件为Firefox 13+。鉴于截至2014年10月的当前版本是Firefox 33.0,并且在Firefox 13和现在之间已经发布了多个ESR版本,使用
for...of
循环可能不会显着减少能够使用您的附加组件的人数。您使用的其他某些功能可能会限制您的附加组件仅适用于更近期的版本。
使用for...of
与
Array.prototype.forEach()不同,
for...of
循环不仅限于数组,还将迭代其他类型的
iterable objects,其中包括许多不同类型的对象。
有时会让人困惑的一件事是,for...of
循环遍历的是属性的值,而不是属性键。根据你所做的操作,这可能非常方便,或者使得for...of
循环不合适。
const listItems = document.querySelectorAll('li');
for (let item of listItems) {
console.log('item text:', item.textContent);
}
<ol>
<li>first</li>
<li>second</li>
<li>third</li>
<li>fourth</li>
</ol>
普通对象通常不是可迭代的(不能使用for...of
)
在普通对象上尝试使用for...of
会抛出错误。
const obj = { first: 3, second: 5, third: 7, fourth: "hello" };
for (let value of obj) {
console.log('value:', value);
}
迭代对象属性值的其他方法
如果您正在寻找执行类似任务的其他方法,
MDN显示示例使用
Array.prototype.forEach()迭代
Arrays和
Objects的属性值:
forEach
直接在从Object.values()
获得的对象值上进行:
const obj = { first: 3, second: 5, third: 7, fourth: "hello" };
Object.values(obj).forEach(function (value) {
console.log('value:', value);
});
forEach
遍历从 Object.keys()
获取的对象键:
const obj = { first: 3, second: 5, third: 7, fourth: "hello" };
Object.keys(obj).forEach(function (key) {
console.log('key:', key);
console.log('value:', obj[key]);
});
forEach
over an Array's values:
const arr = [ 3, 5, 7 ];
arr.forEach(function (value, index) {
console.log('value:', value);
console.log('index:', index);
});
使用
for..in
循环的主要缺点是它会迭代对象的
可枚举属性,包括对象原型上的属性。这可能会导致意外错误。因此,除非你
知道 想要迭代的是不属于对象自身属性的可枚举属性(很少需要),否则总是测试循环的键值是否是对象自己的属性之一,可以使用
Object.prototype.hasOwnProperty()
或其他方法。
虽然这不是必需的,但最好使用一个已知为好的
Object.prototype.hasOwnProperty()
的副本,因为任何对象都可以定义自己的
hasOwnProperty
,无论是有意还是出于错误。
const obj = { first: 3, second: 5, third: 7, fourth: "hello" };
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
console.log('key:', key);
console.log('value:', obj[key]);
}
}
浏览器兼容性:
如果您想将您的插件移植到其他浏览器,或在网页中使用for...of
,那么您应该了解此功能是何时添加到各种浏览器中的。可以在MDN上的浏览器兼容性表格中看到,主要问题是它不受Internet Explorer支持。
这是截至2018年3月11日的MDN的兼容性表格:
- Chrome 29-37:使用
for...of
循环功能需要在偏好设置中启用。在chrome://flags中,激活“启用实验性JavaScript”条目。
- 在Firefox 51之前,使用
const
关键字的for...of
循环结构会抛出SyntaxError(“常量声明中缺少=”)。