forEach -----迭代器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oncemore520/article/details/83412491

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]

猜你喜欢

转载自blog.csdn.net/oncemore520/article/details/83412491