1.forEach只对有效值进行操作
arr = [1,2,,3,undefined]
(5) [1, 2, empty, 3, undefined]
arr.forEach((v,i) => {console.log(v)})
VM301:1 1
VM301:1 2
VM301:1 3
VM301:1 undefined
只会对无效值进行跳过,但是对undefined不会跳过
2.不建议通过forEach对数组进行增删
let arr= [1,2,3,4]
undefined
arr.forEach((v,i) => {if(v == 1){arr.shift()}})
undefined
arr
(3) [2, 3, 4]
arr.forEach((v) => {if(v == 2){arr.shift()}})
undefined
arr
(2) [3, 4]
let words = ["one","two","three","four","five"]
undefined
words.forEach((word) => {if(word === 'two'){words.shift()}})
undefined
words
(4) ["two", "three", "four", "five"]
缺点:没有办法中断或跳出 (使用for/for…of) 使用Array.prototype.every()/Array.prototype.some() 返回false或者true进行中断或者跳出
3.for…in
遍历对象本身的可枚举属性 可以被中断
不建议用于迭代 Array:
不一定保证按照下标顺序
遍历得到的下标是字符串而不是数字
4.for…of
for…of 的本质是在 可迭代对象(iterable objects) 上调用其 迭代方法 创建一个迭代循环,并执行对应语句。可以迭代 数组/字符串/类型化数组(TypedArray)/Map/Set/generators/类数组对象(NodeList/arguments) 等。需要注意的是, Object 并不是一个可迭代对象。
for…of 是 ES6 中新出炉的,其弥补了 forEach 和 for…in 的诸多缺点:
可以使用break, throw 或return 等终止
能正常迭代数组(依赖数组默认的迭代行为)
for…of 得到的是 值(value), 而 for…in 得到的是 键(key)。
如果我们非要想用 for…of 对 Object 所拥有的属性进行遍历,则可使用内置的 Object.keys() 方法:
for (const key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
或者如果你想要更简单得同时得到键和值,可以考虑使用 Object.entries() :
for (const [key, value] of Object.entries(someObject)) {
console.log(key + ": " + value);
}
自定义迭代行为
// 让我们的数组倒序输出 value
const myArr = [1, 2, 3];
myArr[Symbol.iterator] = function () {
const that = this;
let index = that.length;
return {
next: function () {
if (index > 0) {
index--;
return {
value: that[index],
done: false
};
} else {
return {
done: true
};
}
},
};
};
[...myArr]; // [3, 2, 1]
Array.from(myArr) // [3, 2, 1]