为什么不能在 for of 循环中使用对象?或者这是浏览器的错误?此代码在 Chrome 42 中不起作用,表示 undefined 不是函数:
test = { first: "one"}
for(var item of test) {
console.log(item)
}
为什么不能在 for of 循环中使用对象?或者这是浏览器的错误?此代码在 Chrome 42 中不起作用,表示 undefined 不是函数:
test = { first: "one"}
for(var item of test) {
console.log(item)
}
您可以使用以下语法:
const myObject = {
first: "one",
second: "two",
};
for (const [key, value] of Object.entries(myObject)) {
console.log(key, value); // first one, second two
}
然而, Object.entries
现在支持很差 在 IE 中不起作用 或 iOS Safari. 你会大概可能需要一个 polyfill。有关最新消息,请参阅https://caniuse.com/mdn-javascript_builtins_object_entries。
另请参阅Object.keys
仅迭代键或Object.values
仅迭代值。
如果您将数据存储在键值存储中,请使用Map
专为此目的而设计的。
如果你必须使用一个对象,ES2017 (ES8) 允许你使用Object.values
:
const foo = { a: 'foo', z: 'bar', m: 'baz' };
for (let value of Object.values(foo)) {
console.log(value);
}
如果还不支持,请使用 polyfill: Alternative version forObject.values()
最后,如果您支持不支持此语法的旧环境,则必须求助于使用forEach
and Object.keys
:
var obj = { a: 'foo', z: 'bar', m: 'baz' };
Object.keys(obj).forEach(function (prop) {
var value = obj[prop];
console.log(value);
});
ECMAScript 2015/ES6 中的迭代器、可迭代和 for..of 循环
let tempArray = [1,2,3,4,5];
for(element of tempArray) {
console.log(element);
}
// 1
// 2
// 3
// 4
// 5
但是如果我们这样做
let tempObj = {a:1, b:2, c:3};
for(element of tempObj) {
console.log(element);
}
// error
我们得到错误,因为for..of循环仅适用于Iterables,即具有遵守Iterator 协议的@@iterator的对象,这意味着它必须具有一个带有next方法的对象。next 方法没有参数,它应该返回一个具有这两个属性的对象。
done : 当为真时表示序列已经结束,假意味着可能有更多的值 value:这是序列中的当前项目
因此,要使对象Iterable使其与for..of 一起工作,我们可以:
1 . 通过Symbol.iterator属性分配给它神秘的@@iterator属性,使一个对象成为一个Iterable。这里是如何:
let tempObj = {a:1, b:2, c:3};
tempObj[Symbol.iterator]= () => ({
next: function next () {
return {
done: Object.keys(this).length === 0,
value: Object.keys(this).shift()
}
}
})
for(key in tempObj){
console.log(key)
}
// a
// b
// c
2.使用Object.entries,它返回一个Iterable:
let tempObj = {a:1, b:2, c:3};
for(let [key, value] of Object.entries(tempObj)) {
console.log(key, value);
}
// a 1
// b 2
// c 3
3.使用Object.keys,方法如下:
let tempObj = {a:1, b:2, c:3};
for (let key of Object.keys(tempObj)) {
console.log(key);
}
// a
// b
// c
希望这可以帮助!!!!!!
我使用以下代码使对象可迭代:
Object.prototype[Symbol.iterator] = function*() {
for(let key of Object.keys(this)) {
yield([ key, this[key] ])
} }
用法:
for(let [ key, value ] of {}) { }
或者:
for(let [ key, value ] of Object.entries({})) { }