Appearance
迭代方法
本节目标:理解“迭代方法”的核心思路,并能把它用于实际开发或面试表达。 这些迭代方法接受两个参数,第一个参数表示要在数组每一项上执行的函数,第二个参数表示运行该函数的作用域对象(可选的)——影响this的值。
作为第一个参数的函数会被传入三个参数:当前正处理的数组项,该数组项的索引和原数组本身; 这些方法的返回值各有区别,但它们都不会改变原数组: filter() 对数组中的每一项执行给定函数,返回该函数会返回true的项组成的数组。 forEach() 对数组中的每一项执行给定函数,无返回值。 map() 对数组中的每一项执行给定函数,返回每次函数调用的结果组成的数组。 every() 对数组中的每一项执行给定函数,如果该函数对每一项都返回true,则返回true。 some() 对数组肿的每一项执行给定函数,如果该函数对任一项返回true,则返回true。
find() 和 findIndex() 数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。 [1, 4, -5, 10].find((n) => n < 0)// -5
上面代码找出数组中第一个小于 `0` 的成员。[1, 5, 10, 15].find(function(value, index, arr) { return value > 9;}) // 10 上面代码中,find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。 数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。 [1, 5, 10, 15].findIndex(function(value, index, arr) { return value > 9;}) // 2 这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。 function f(v){ return v > this.age;}let person = {name: 'John', age: 20};[10, 12, 26, 15].find(f, person); // 26 上面的代码中,find函数接收了第二个参数person对象,回调函数中的this对象指向person对象。 另外,这两个方法都可以发现NaN,弥补了数组的indexOf方法的不足。 [NaN].indexOf(NaN)// -1 [NaN].findIndex(y => Object.is(NaN, y))// 0 上面代码中,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到。
**entries()****,**keys() 和 values()entries(),keys()和values()用于遍历数组,并返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。 for (let index of ['a', 'b'].keys()) { console.log(index);}// 0// 1 for (let elem of ['a', 'b'].values()) { console.log(elem);}// 'a'// 'b' for (let [index, elem] of ['a', 'b'].entries()) { console.log(index, elem);}// 0 "a"// 1 "b" 如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。 let letter = ['a', 'b', 'c'];let entries = letter.entries();console.log(entries.next().value); // [0, 'a']console.log(entries.next().value); // [1, 'b']console.log(entries.next().value); // [2, 'c']
