扩展运算符:将一个数组转为用逗号分割的参数序列
- 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类对象转成真正的数组
构造函数新增的方法
- 类似数组对象:有length属性,如NodeList、arguments对象
- 可遍历对象:有iterator接口的,如Map
对于数组,会返回一个一样的新数组, 所以也可以用于复制
可以使用Array.prototype.slice 方法替代
// 浏览器不支持可以用[].slice.call模拟
const toArr = (()=>{
if(Array.from){
Array.from
}else{
obj => [].slice.call(obj)
}
})();
三个参数:
- 对象
- map处理函数
- this指向
Array.of():将数值转换为数组
这个方法 主要是为了弥补Array构造函数的不足,因为Array构造函数的参数是一个的时候,代表的构造数组长度等于n的数组。Array.of基本上可以替代new Array()
// 浏览器不支持可以用[].slice.call模拟
function ArrayOF(){
return [].slice.call(arguments);
}
实例对象新增的方法:
- 数组的copyWithin(0,3,4) : 将数组的第三个位置的元素 替换到0索引上 会修改原数组
- find() 和findIndex(): 第一个参数是函数,第二个参数是this指向。弥补了IndexOf()的不足
- fill(): 用于初始化的填充
- entries(),keys(),values() : 用于遍历数组, 可以用for... of 循环遍历
for(let [index,item] of xx.entries()){....}
- includes() : 是IndexOf 的替换。参数数值长度大于数组长度,则从0开始
indexOf 缺点: 不够语义化 + 对NaN 检测的不准确
// 浏览器不支持可以用some模拟
Array.prototype.includes ? (arr,val)=> arr.includes(val);
: (arr,val)=> arr.some((el)=>el ===val);
- flat(),flatMap()
flat(2)将数组扁平化处理,返回一个新数组,对原数据没有影响
flatMap()方法对原数组的每个成员执行一个函数相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组, 第二个参数是this指向
数组的空位:
ES6 统一了数组的空位, 都是undefined
之前的话对空位的处理不统一,foreach、every、some、filter 是跳过空位。
map方法是跳过但保留空位
join 、tostring 是当成undefined
谁能够实现数组的复制:
浅拷贝
- 扩展运算符:
const new_arr = [...arr] - Array.from():
const new_arr = Array.from(arr) - concat():
const new_arr = arr.concat() - slice():
const new_arr = arr.slice() - map():
const new_arr = arr.map((x)=>x) - for():
- reduce():
JSON.parse(JSON.stringify())