zoukankan      html  css  js  c++  java
  • ES6 学习(8) ---数组

    1、 扩展符 // 可以将数组转为用逗号相隔开的参数序列

     1 //
     2 console.log(...[1,2,3]) // 1, 2, 3
     3 
     4 // 用于函数调用
     5 function add(x, y) {
     6   return x + y;
     7 }
     8 
     9 const numbers = [4, 38];
    10 add(...numbers) // 42
    11 
    12 // 

      扩展符的应用

     1 // (1) 复制数组  (浅复制)
     2 let arr = [ 1, 2, 3, 4 ]
     3 // ES5 方法
     4 let arr1 = arr.concat() 
     5 // ES6 扩展符用法
     6 let arr1 = [...arr];
     7 let [...arr1] = arr;
     8 
     9 // (2) 合并数组
    10 var arr = [1,2]; 
    11 var arr1 = [3,4];
    12 var arr2 = [5,6];
    13 // ES5
    14 var arr3 = arr.concat(arr1,arr2) // [1, 2, 3, 4, 5, 6]
    15 // ES6
    16 let arr3 = [...arr1, ...arr2, ...arr] 
    17 
    18 // (3) 与解构赋值一起使用, 扩展符只能在最后使用否则报错
    19 let [a, ...b] = [1, 2, 3, 4, 5]
    20 a // 1
    21 b // [2, 3, 4, 5]
    22 
    23 // (4) 将字符串转换成数组, 扩展符能识别四个字符的Unicode 字符
    24 [...'hello']
    25 // [ "h", "e", "l", "l", "o" ]
    26 
    27 let str = 'xuD83DuDE80y'; 
    28 
    29 str.split('').reverse().join('')
    30 // 'yuDE80uD83Dx'
    31 
    32 [...str].reverse().join('')
    33 // 'yuD83DuDE80x'
    34 
    35 // (5) 

     2、Array.from() // 将类似数组的对象、伪数组和可遍历的对象转换为真正的数字

     1 // 类似数组的对象
     2  let likeArray = {
     3    '0': 'a',
     4    '1': 'b',
     5    '2': 'c',
     6    length: 3
     7 };
     8 // dom 节点
     9  let nodeList = document.querySelectorAll("div")
    10 // 函数中的arguments对象
    11 
    12 // 以上都能转换成数组 只要是部署了 Iterator 接口的数据结构,Array.from都能将其转为数组。
    13 // ES5 的方法
    14  Array.prototype.slice.call(likeArray)
    15 // ES6 方法
    16  Array.from(likeArray)
    17  Array.from(nodeList)

      Array.from() // 第一个参数是要转成数组的对象,第二个参数是一个函数,相当于转换成数组后进行 map遍历的函数, 第三个参数可以用来绑定this

     1 Array.from(arrayLike, x => x * x);
     2 // 等同于
     3 Array.from(arrayLike).map(x => x * x);
     4 
     5 Array.from([1, 2, 3], (x) => x * x)
     6 
     7 // 此外还可以获取节点文本内容
     8 let divs = document.querySelectorAll('div');
     9 
    10 // map()
    11 let names1 = Array.from(divs, s => s.textContent);

      Array.from() // 还可以将字符串转换成数组

    1 let str = "abc"
    2 // ES5
    3 let arr = str.split("");
    4 // ES6
    5 let arr1 = Array.from(str) // ["a", "b", "c"]
    6 
    7 // Array.from()的另一个应用是,将字符串转为数组,然后返回字符串的长度。因为它能正确处理各种 Unicode 字符,可以避免 JavaScript 将大于uFFFF的 Unicode 字符,算作两个字符的 bug。

    3、 Array.of() // Array.of方法用于将一组值,转换为数组。 主要是用来弥补 Array() 方法由于参数个数不同转换成数组的形式不同

     1 Array() // []
     2 Array(3) // [, , ,]
     3 Array(3, 11, 8) // [3, 11, 8]
     4 // Array() 方法当只有一个参数的时候视为数组的长度,而Array.of() 就解决了这个问题
     5 Array.of() // []
     6 Array.of(3) // [3]
     7 Array.of(3, 11, 8)// [3,11,8]
     8 
     9 // Array.of() 方法模拟
    10 function ArrayOf(){
    11   return [].slice.call(arguments);
    12 }

    4、copyWithin() // 将指定位置的成员复制到其他位置(会覆盖其他成员),会修改当前数组

      Array.prototype.copyWithin(target, start = 0, end = this.length)

      它接受三个参数(参数都应该是数值类型,不就就转换为数值)。

      • target(必需):从该位置开始替换数据。如果为负值,表示倒数。
      • start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
      • end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
    // 将3号位复制到0号位
    [1, 2, 3, 4, 5].copyWithin(0, 3, 4)
    // [4, 2, 3, 4, 5]
    
    // -2相当于3号位,-1相当于4号位
    [1, 2, 3, 4, 5].copyWithin(0, -2, -1)
    // [4, 2, 3, 4, 5]
    
    // 将3号位复制到0号位
    [].copyWithin.call({length: 5, 3: 1}, 0, 3)
    // {0: 1, 3: 1, length: 5}

    5、find() 和 findIndex()

      find() // 找出第一个符合条件的数组成员,找到返回true,没找到返回undefined

      findIndex() // 找出第一个符合条件的数组成员位置,找到范围index,没找到返回-1

      两个方法都有两个参数 第一个函数,第二个是用来绑定函数的this指向

      arr.find( ( item, index, arr )=> {} )

      arr.findIndex( ( item, index, arr )=> {} )

     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
     6 
     7 // 另外,这两个方法都可以发现NaN,弥补了数组的indexOf方法的不足。
     8 [NaN].indexOf(NaN)
     9 // -1
    10 
    11 [NaN].findIndex(y => Object.is(NaN, y)) // Object.is() 判断两个值是否相同

    6、fill() // 使用定值填充一个数组

      arr.fill( "item", start, end ) , 要填充的值,起始(从1开始), 结束。 会抹去原数组成员

      需要注意的是:如果填充的值是一个对象,那么只是对象的赋值,而不是深拷贝。

     7、 数组实例的 entries()、 keys()、values() 由于遍历数组

     1 for (let index of ['a', 'b'].keys()) { // 数组各元素键的遍历
     2   console.log(index);
     3 }
     4 // 0
     5 // 1
     6 
     7 for (let elem of ['a', 'b'].values()) { // 数组各元素值的遍历
     8   console.log(elem);
     9 }
    10 // 'a'
    11 // 'b'
    12 
    13 for (let [index, elem] of ['a', 'b'].entries()) { // 数组键值对的遍历
    14   console.log(index, elem);
    15 }
    16 // 0 "a"
    17 // 1 "b"

    8、Array.prototype.includes(value,index) // 表示数组中是否有给定的值value, 返回布尔值;第二个参数index表示起始搜索的位置,如果是负数就表示倒数

      此方法与 indexOf() 方法的区别是,indexOf 是严格的等于( === ) ; 不能判断NaN,但是 includes() 方法能够判断数组中是否包含 NaN

    9、Array.prototype.flat( arg = 1 )、 Array.prototype.flatMap( function ) // 扁平化数组;

      Array.prototype.flat(),将多维数组进行降维处理,默认降一层; 如果是变成一维数组可传参数 infinity ;

    1 [1, 2, [3, [4, 5]]].flat(1) // [1, 2, 3, [4, 5]]
    2 [1, [2, [3]]].flat(Infinity) // [1, 2, 3]
    3 
    4 // 如果原数组有空位,flat()方法会跳过空位。
    5 [1, 2, , 4, 5].flat() // [1, 2, 4, 5]

      Array.prototype.flatMap() // 此方法是对数组的各个成员进行遍历(相当于map函数,函数参数同map方法参数一致),然后对换算的返回值组成的数组进行flat()方法,该方法返回一个新的数组,不改变原数组。

    [1, 2, 3, 4].flatMap(x => [[x * 2]])
    // [[2], [4], [6], [8]] 此方法只能降一层

    10、数组的空位 // ☞ 数组的某一个位置没有值 例:Array(3) 为 [, , ,]

      ES5 的方法对空位的处理并不一致,但一般会忽略空位,但是ES6 的方法一般会视为undefined的处理。由于不同方法对空位的处理非常不一致,因此尽量减少出现空位。

    // ES5 对空位的处理
        // forEach(), filter(), reduce(), every() 和some()都会跳过空位。
        // map()会跳过空位,但会保留这个值
        // join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
    
    // ES6中的方法 entries()、keys()、values()、find()和findIndex()等会将空位处理成undefined。
  • 相关阅读:
    linux查看网卡个数及速度
    win7下设置 WiFi AP
    Scalaz(2)- 基础篇:随意多态-typeclass, ad-hoc polymorphism
    复用的基础是组件化与标准化
    Java & Groovy & Scala & Kotlin
    函数式编程的类型系统:typeclass--Functor的解释--构造类型
    类型构造器-Functor[F[_]]
    类型构造器--高阶类型(构造器):Kind (type theory)--类型的元
    函数的类型:函数也是类型 (*)->*
    应用内存管理三要素
  • 原文地址:https://www.cnblogs.com/newttt/p/12514487.html
Copyright © 2011-2022 走看看