• Array API—01


    首先,打开浏览器控制台,输入[].__proto__可以看到所有的方法

    (1)concat()

    concat() 方法用于连接两个或多个数组

    该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本

    arr.concat(arr1,arr2,...,arrn)

    1         let arr1 = [1,2]
    2         let arr2 = [4,5]
    3         let arr = arr1.concat(arr2)
    4         console.log(arr);  // [1, 2, 4, 5]

    注意:

    • 如果concat中的参数不是数组,则连接的是单个的元素

    (2)copyWithin()—ES6

    copyWithin()方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。

    array.copyWithin(target, start, end)

    • target(必需):从该位置开始替换数据。如果为负值,表示倒数。
    • start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
    • end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
    1         let arr = [1,2,3,4,5,6,7,8]
    2         arr.copyWithin(2,4)  // 1,2,5,6,7,8,7,8
    3         arr.copyWithin(2,4,6)  // 1,2,5,6,5,6,7,8  

    说明:

    • 第二行表示从索引为2的地方(3)开始替换,替换内容为从索引为4的地方(5)到结尾(5,6,7,8),替换了4个元素,两个没有替换所以仍然是7,8
    • 第三行表示从索引为2的地方(3)开始替换,替换内容为索引4-6之间(不包含6)的元素(5,6),因此3,4地方被替换为5,6。

    注意:这三个参数都应该是数值,如果不是,会自动转为数值。

    (3)entries()、keys()、values()—ES6

    ES6的这三个新方法都是用来遍历数组的。都返回一个遍历器对象,可以用for...of...循环遍历

    • keys():对键名的遍历
      • let arr = ['a','b']
        let iter = arr.keys()
        for (let index of iter){
            console.log(index);  // 0  1
        }
    • values():对键值的遍历
      • 1 let arr = ['a','b']
        2 let iter = arr.values()
        3 for (let val of iter){
        4     console.log(val);  // a  b
        5 }
    • entries():对键值对的遍历
      • 1 let arr = ['a','b']
        2 let iter = arr.entries()
        3 for (let ent of iter){
        4     console.log(ent);  // [0,"a"] [1,"b"]    
        5 }

    如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。

    1 let letter = ['a', 'b', 'c'];
    2 let entries = letter.entries();
    3 console.log(entries.next().value); // [0, 'a']
    4 console.log(entries.next().value); // [1, 'b']
    5 console.log(entries.next().value); // [2, 'c']

     (4)every() & some()

    every()判断数组中是否每一个元素都符合条件,都符合返回true,否则返回false。它们的参数都是一个回调函数

    1 let arr = [4,5,6]
    2 let allBig = arr.every((elem,i,arr)=>{
    3     return elem >3
    4 })
    5 console.log(allBig);  // true

    说明:

    • 回调中的三个参数:
      • 第一个:当前遍历的元素
      • 第二个:当前遍历元素的索引
      • 抵三个:被遍历的数组

    some()功能与every()对应,作用是判断数组中是否符合某个条件的元素,有一个符合就返回true,否则返回false。用法同上

    (5)fill()—ES6

    fill()方法使用给定的值,填充一个数组

    1 ['a', 'b', 'c'].fill(7)
    2 // [7, 7, 7]
    3 
    4 new Array(3).fill(7)
    5 // [7, 7, 7]

    fill方法执行结束,数组中已有的元素会被全部抹去

    还可以指定第二个第三个参数,用于指定填充的起始位置和结束位置

    1 ['a', 'b', 'c','d'].fill(7, 1, 3)  // ["a", 7, 7, "d"]

    注意:如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象

    (6)filter()

    filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。参数是一个回调函数

    1         let arr =[1,2,3,4,5,6,7]
    2         let newArr = arr.filter((e,i,a)=>{
    3             return e%2===0
    4         })
    5         console.log(newArr);  // [2, 4, 6]

    说明:

    • 这个代码功能是返回一个arr数组中是偶数的成员
    • 回调中的三个参数的作用与上面的every()方法和some()相同

    (7)find() & findIndex()—ES6

    find()方法用于找出第一个符合条件数组成员。参数是一个回调函数,回调函数的参数与every(),some(),filter()相同。没找到返回undefined

    1         let arr = [1,2,3,4]
    2         let n = arr.find((item) => item>2)
    3         console.log(n);  // 3

    findIndex()方法与find()方法非常类似。不同之处在于它返回的是第一个符合条件的数组成员的索引。没找到返回-1

    这两个方法都可以接受第二个参数,用来绑定回调函数的this对象

    1 function f(v){
    2   return v > this.age;
    3 }
    4 let person = {name: 'John', age: 20};
    5 [10, 12, 26, 15].find(f, person);    // 26

     另外这两个方法都可以发现NaN,弥补了数组的indexOf方法的不足

    1 [NaN].indexOf(NaN)
    2 // -1
    3 
    4 [NaN].findIndex(y => Object.is(NaN, y))
    5 // 0

     上面代码中,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到。

    (8)flat() & flatMap()—ES6

    ①flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响

    1         let arr = [1,2,[4,5]]
    2         let fArr = arr.flat()
    3         console.log(fArr);  // [1, 2, 4, 5]

    flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。

    1         let arr = [1,2,[4,[7,8]]]
    2         let fArr = arr.flat(2)
    3         console.log(fArr);  // [1, 2, 4, 7,8]

    如果不论多少层都拉平的话,可以使用Infinity关键字作为参数

    1         let arr = [1,2,[4,[7,8]]]
    2         let fArr = arr.flat(Infinity)
    3         console.log(fArr);  // [1, 2, 4, 7,8]

    如果原数组有空位,flat()方法会跳过空位。

    ②flatMap()方法对源数组的每一个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组

    1         let arr = [2,3,4]
    2         let newArr = arr.flatMap((item) => {
    3             return [item,item*item]
    4         })
    5         console.log(newArr);  // [2, 4, 3, 9, 4, 16]

     flatMap()只能展开一层数组。

    1 [1, 2, 3, 4].flatMap(x => [[x * 2]])
    2 // [[2], [4], [6], [8]]

     (9)forEach()

    forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数

    1         let arr = [2,3,4]
    2         arr.forEach((e,i,a)=>{
    3             console.log(e);
    4         })

    说明:e,i,a这三个参数同其他大部分数组方法的回调一样,分别是:当前遍历的元素、当前元素的索引、原数组

    注意:

    • 对于基本类型的数组元素,直接在e上操作当前元素(修改当前元素的值),原数组不会改变。如果当前元素是引用类型,则可以直接通过e修改(因为引用的是地址)
    • 如果需要改变当前元素的值,则可以使用a[i]的方式访问当前元素,加以修改

    (10)includes()—ES6

    includes()方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。

    1 [1, 2, 3].includes(2)     // true
    2 [1, 2, 3].includes(4)     // false
    3 [1, 2, NaN].includes(NaN) // true

    此方法第二个参数表示搜索的起始位置,默认为0,如果为负数,则表示倒数的位置。如果大于数组长度,则会重置为0开始

    与indexOf()相比语义化较好,不会对NaN的误判:

    1 console.log([1,NaN].includes(NaN));  // true
    2 console.log([1,NaN].indexOf(NaN));  // -1

    下面代码用来检查当前环境是否支持该方法,如果不支持,部署一个简易的替代版本。

    1 const contains = (() =>
    2   Array.prototype.includes
    3     ? (arr, value) => arr.includes(value)
    4     : (arr, value) => arr.some(el => el === value)
    5 )();
    6 contains(['foo', 'bar'], 'baz'); // => false

     

  • 相关阅读:
    高性能Javascript DOM编程学习笔记
    高性能Javascrip 改变作用域链
    高性能Javascript 加载和执行 读书笔记
    javascript 在function 里return 重写function 而得到更多的作用域 闭包
    HTML、css和javascript开发Android程序第五章节 客户端存储 学习笔记
    高性能Javascript HTML集合访问的学习笔记
    高性能Javascript 数据访问读书笔记
    博客
    高性能Javascript 缓存对象成员
    高性能Javascript 克隆节点学习笔记
  • 原文地址:https://www.cnblogs.com/codexlx/p/14308338.html
Copyright © 2020-2023  润新知