Q1: 求数组中最大值
js中不提供求数组最大元素的函数,Math,.max也不接受数组作为参数
apply 接受数组参数,把数组参数拆开,做了[args] -> arguments的动作
//ES6
Math.max(...[1,22,567,34,22])
//等同于
Math.max(1,22,567,34,22)
//ES5的做法
Math.max.apply(null,[1,22,567,34,22])
Q2:将一个数组push到另一个数组
//ES6
let arr1 = [0,1,2];
let arr2 = [3,4,5];
arr1.push(...arr2);
//ES5
Array.prototype.push.apply(arr1.arr2);
Q3 复制数组
数组是复合的数据类型,直接复制的话,只是复制 了指向底层数据结构的指针,而不是克隆一个全新的数组
concat不改变原数组,返回两个数组连接之后的新数组,ES5使用猥琐的方法复制数组
//ES6
const a1 = [1,2];
//方式一
const a2 = [...a1];
//方式二
const [...a2] = a1;
//ES5
const a2 = a1.concat();
Q4: 合并数组
这两种方法都是浅拷贝,因为他们的成员是对原数组的引用,如果修改了原数组的成员,会同步反映到新数组。
const arr1 = [1,2,3];
const arr2 = [4,5,6];
const arr3 = [7,8,9];
//ES6
[...arr1,...arr2,...arr3];
//ES5
arr1.concat(arr2,arr3);
Q5: 与结构赋值结合,用于生成数组
数组的slice(from,end)方法,从原数组截取from到end(不包含)的元素,返回一个新的数组。
//ES6
[a,...rest] = list;
//ES5
a = list[0],
rest = list.slice(1);
Q6: 字符串转为数组
[..."hello"]
// [ "h", "e", "l", "l", "o" ]
Q7: 将类数组对象转化为真正的数组
实现了Iterator接口的对象可以用扩展运算符转为真正的数组
没有实现Iterator接口的类数组对象可以用Array.from转为真正的数组
//实现了Iterator的对象
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
//未实现Iterator的对象
let arrayLike = {
'0' : 'a',
'1' : 'b',
'2' : 'c',
length: 3
};
let arr = [...arrayLike];
// TypeError: Cannot spread non-iterable object.
let arr = Array.from(arrayLike);
//ES5
var arr = [].slice.call(arrayLike);
Q8:Map和Set结构,Generator函数
扩展运算符内部调用的是数据结构的Iterator接口,只要具有Iterator接口的对象,都可以使用扩展运算符。
Generator函数运行后,返回一个遍历器对象,因此也可以是用扩展运算符。
let map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let arr = [...map.keys];//[1,2,3]
//Generator
const go = function*(){
yield 1;
yield 2;
yield 3;
};
[...go()] //[1,2,3]