zoukankan      html  css  js  c++  java
  • ES6标准入门

    扩展运算符 spread

    • ...
    • 如同rest参数的逆运算,将一个数组转为用逗号分隔的参数序列
    • 该运算符主要用于函数调用
    • 如果扩展运算符后面是一个空数组 则不产生任何效果
    • 由于扩展运算符可以展开数组,所以不再需要使用apply方法将数组转为函数的参数。
    #例子1
    # ES5 的写法
    function f (x, y, z) {
      ...
    }
    let args = [0, 1, 2]
    f.apply(null, args)
    
    # ES6 的写法
    f(...args)
    
    # 例子2
    # ES5 的写法
    let arr1 = [0, 1, 2]
    let arr2 = [3, 4, 5]
    Array.prototype.push.apply(arr1, arr2)
    
    # ES6 的写法
    arr1.push(...arr2)
    
    • 扩展运算符的应用
      • 合并数组
        • arr1.concat(arr1, arr2) -> [...arr1, ...arr2, ...arr3]
      • 与解构赋值结合
        • const [first, ...rest] = [1, 2, 3, 4, 5]
        • 如果将扩展运算符用于数组赋值,则只能将其放在参数的最后一位。
      • 函数的返回值
        • js的函数只能返回一个值 如果需要返回多个值,只能返回数组或者对象。扩展运算符提供了解决这个问题的方法。
        • 通过扩展运算符可以直接将数据传入构造函数中
      • 字符串
        • 使用扩展运算符可以将字符串转为真正的数组
        • ` [...'hello'] -> [ 'h', 'e', 'l', 'l', 'o']
        • 能够正确识别32位的Unicode字符。
      • 实现了iterator接口的对象
        • 任何iterator接口的对象都可以用扩展运算符转为真正的数组。
        • 扩展运算符内部调用的是数据结构的iterator接口,因此只要具有iterator接口的对象,都可以使用扩展运算符,如Map结构。
        • Generator函数运行后会返回一个遍历器对象,因此也可以使用扩展运算符。
        • 对于没有iterator接口的对象,使用扩展运算符将会报错。

    Array.from

    • Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)对象(包括新增的数据结构Set和Map)
    # 类数组对象本质特征只有一点: 即必须有length属性
    let arrayLike = {
      '0' : 'a',
      '1' : 'b',
      '2' : 'c',
      length : 3
    }
    # ES5
    let arr1 = [].slice.call(arrayLike)
    # ES6
    let arr2 = Array.from(arrayLike)
    
    • 实际应用中,常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments对象。Array.from都可以将其转换为真正的数组。
    • 如果参数是一个真正的数组,则Array.from方法会返回一个一模一样的数组。
    • 对于还没有部署该方法的浏览器 可以使用Array.prototype.slice()方法替代。
    • Array.from还可以接收第二个参数,作用类似于数组的map方法。即对每个元素进行处理,将处理后的值放入数组。
    Array.from(arrayLike, x => x * x)
    # 等同于
    Array.from(arrayLike).map(x => x * x)
    
    • 还可以传入Array.from第三个参数,用来绑定this。
    • Array.from可以将各种值转换为真正的数组,并且提供map功能
    • Array.from可以利用第一个参数指定第二个参数运行的次数
      • ` Array.from({ length : 2 }, () => 'jack') //[ 'jack', 'jack']
    • Array.from的另一个应用是将字符串转换为数组,然后返回字符串的长度,因为它能正确处理各种Unicode字符,可以避免js将大于uFFFF的Unicode字符算作两个字符的bug。

    Array.of()

    • Array.of方法用于将一组值转换为数组。
    • 这个方法主要的目的是弥补数组构造函数Array()的不足 -> 因为参数个数的不同导致的行为的差异。
    Array.of( 3 )   // [3]
    Array(3)   // [, , ,]
    
    • Array.of基本上可以用来替代Array()或new Array(),并且不存在由于参数不同而导致的重载,它的行为非常统一。
    • Array.of总是返回参数值组成的数组。如果没有参数,就返回一个空数组。
    • Array.of方法可以用下面的代码模拟实现
    function ArrayOf () {
      return [].slice.call(arguments)
    }
    

    数组实例的方法

    • copyWithin()
      • 该方法会在当前数组内部将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。即会修改当前的数组。
    Array.prototype.copyWithin(target, start = , end = this.length)
    
    • target :从该位置开始替换数据。
    • start : 从该位置开始读取疏,默认为0。如果为负值,表示倒数(相加的结果)。
    • end : 到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
    • 这三个参数都应该是数值,如果不是,会自动转为数值。
    • find()和findIndex()

      • find
        • 用于找出第一个符合条件的数组成员,
        • 参数: 回调函数。
          • 该方法的回调参数可以接收三个参数:依次为当前的值,当前的位置,和原数组。
        • 所有数组成员依次执行该回调函数,直到找到第一个为true的成员,然后返回该成员。
        • 如果没有符合的成员即返回undefined
      • findIndex
        • 返回第一个符合条件的数组成员的位置
        • 如果所有数组成员都不符合,则返回-1。
      • 这两个参数都可接收第二个参数,用来绑定回调函数的this值
      • 这两个方法都可以发现NaN,弥补了数组indexOf方法的不足。
        • indexOf方法无法识别数组的NaNcy成员,但是findIndex方法可以借助Object.is实现。
        • [NaN].findIndex(y => Object.is(NaN, y)
    • fill()

      • 该方法使用给定值填充一个数组。
    ['a', 'b', 'c'].fill(7)
    // [7, 7, 7]
    
    new Array(3).fill(7)
    // [7, 7, 7]
    
    • fill方法用于空数组的初始化时非常方便。数组中已有的元素会被全部抹去。
    • fill方法还可接收第二个和第三个参数,用于指定填充的起始位置和结束位置
    • entries() / keys() / values()
      • 以上三个方法用于遍历数组。并且都返回一个遍历器对象,可用for...of循环遍历。
      • keys()是对键名的遍历。
      • values()是对键值的遍历。
      • entries()是对键值对的遍历。
    for(let index of ['a', 'b'].keys()) { 
      console.log(index)
    }
    # 如果不使用for...of循环,可以手动调用遍历器对象的next方法进行遍历。
    let letter = ['a', 'b', 'c']
    let entries = letter.entries()
    console.log(entries.next().value) //[0. 'a']
    console.log(entries.next().value) //[0. 'b']
    console.log(entries.next().value) //[0. 'c']
    
    • includes()
      • 该方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。
      • [1, 2, 3].includes(2) // true
      • 该方法的第二个参数表示搜索的起始位置
      • 如果第二个参数为负数,则表示倒数的位置。如果该负数的绝对值大于数组长度,则会重置为0开始。
      • 没有该方法之前,我们通常使用数组的indexOf方法检查是否包含某个值。
      • 但是indexOf方法有两个缺点
        • 不够语义化
          • 其含义是找到参数值的第一个出现的位置,所以要比较是否不等于-1,表达起来不够直观。
        • 内部使用严格相等运算符 回导致对NaN的误判。

    数组的空位

    • 空位不是undefined,一个位置的值等于undefined依然是有值的。空位是没有任何值的,in运算符可以说明这一点。
    • ES5对空位的处理很不一致,大多数情况下会忽略空位。
      • forEach()、filter()、every()、some()都会跳过空位
      • map会跳过空位,但会保留这个值
      • join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
      • Array.form()、 ...扩展运算符会将数组的空位转为undefined,即该方法不会忽略这个空位。
      • copyWithin()会连着空位一起复制。
      • fill()会将空位视为正常的数组位置。
      • for...of循环也会遍历空位。
    • 由于空位的处理规则非常不统一,所以建议避免出现空位。

    笔记内容整理来自阮一峰老师的《ES6标准入门》

  • 相关阅读:
    11
    961. N-Repeated Element in Size 2N Array
    用numpy.pad()对图像进行填充及简单的图像处理
    709. To Lower Case
    929. Unique Email Addresses
    771. Jewels and Stones
    谭凯---访谈录
    如何拍照
    主题阅读法
    社会各职业工作重心和流程
  • 原文地址:https://www.cnblogs.com/liyf-98/p/14416118.html
Copyright © 2011-2022 走看看