ES6 数组的扩展

66 阅读3分钟

扩展运算符:将一个数组转为用逗号分割的参数序列

  • rest参数的逆运算
  • 主要用于函数调用
  • 可以放置表达式
  • 可以替代ES5的apply方法
    • Math.max.apply(null,[1,24,44]) 等同于 Math.max(...[1,24,44])

因为JS不提供 求数组最大元素的 的函数,所以只能套用Math.max函数将数组转为 一个参数序列。

扩展运算符的应用:

  • 提供了数组合并的新写法 arr.concat(...[1,2,3])
  • 可以结合结构赋值使用 const [first, ...rest] = [1,2,3,4,5]
    • 如果用于数组赋值:只能放在参数的最后一位
  • 函数的返回值可以返回...xxx
  • 可以将字符串转成真正的数组
    • 因为js会将32Unicode字符识别为2个字符
      •   function len(str){ return [...str].length}
        
  • 对任何实现了Iterator接口的对象 都可以转成真正的数组(下面几个都有Iterator接口)
    • Map
    • Set
    • Generator函数

Array.from():将2类对象转成真正的数组

构造函数新增的方法

  1. 类似数组对象:有length属性,如NodeList、arguments对象
  2. 可遍历对象:有iterator接口的,如Map

对于数组,会返回一个一样的新数组, 所以也可以用于复制

可以使用Array.prototype.slice 方法替代

// 浏览器不支持可以用[].slice.call模拟 

const toArr = (()=>{
    if(Array.from){
       Array.from
    }else{
        obj => [].slice.call(obj)
        
    }
})();

三个参数:

  1. 对象
  2. map处理函数
  3. this指向

Array.of():将数值转换为数组

这个方法 主要是为了弥补Array构造函数的不足,因为Array构造函数的参数是一个的时候,代表的构造数组长度等于n的数组。Array.of基本上可以替代new Array()

// 浏览器不支持可以用[].slice.call模拟 
function ArrayOF(){
    return [].slice.call(arguments);

}

实例对象新增的方法:

  1. 数组的copyWithin(0,3,4) : 将数组的第三个位置的元素 替换到0索引上 会修改原数组
  2. find() 和findIndex(): 第一个参数是函数,第二个参数是this指向。弥补了IndexOf()的不足
  3. fill(): 用于初始化的填充
  4. entries(),keys(),values() : 用于遍历数组, 可以用for... of 循环遍历
    for(let [index,item] of xx.entries()){....}
  1. includes() : 是IndexOf 的替换。参数数值长度大于数组长度,则从0开始

indexOf 缺点: 不够语义化 + 对NaN 检测的不准确

 // 浏览器不支持可以用some模拟 
 Array.prototype.includes ? (arr,val)=> arr.includes(val);
                          : (arr,val)=> arr.some((el)=>el ===val);
  1. flat(),flatMap()

flat(2)将数组扁平化处理,返回一个新数组,对原数据没有影响

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

数组的空位:

ES6 统一了数组的空位, 都是undefined

之前的话对空位的处理不统一,foreach、every、some、filter 是跳过空位。

map方法是跳过但保留空位

join 、tostring 是当成undefined

谁能够实现数组的复制:

浅拷贝

  1. 扩展运算符: const new_arr = [...arr]
  2. Array.from(): const new_arr = Array.from(arr)
  3. concat():const new_arr = arr.concat()
  4. slice(): const new_arr = arr.slice()
  5. map():const new_arr = arr.map((x)=>x)
  6. for():
  7. reduce():
  8. JSON.parse(JSON.stringify())