Map和Set以及数组扩展符

map是键值对的集合,value-key。map也是高阶函数【注;高阶函数是指可以接受函数作为参数的这类函数】**。
map中的操作方法有:get、set、has、delete;若是对同一个键名进行set键值,那么后set的键值会覆盖之前的键值。
例子:
a.map(String); //(3) [“1”, “2”, “3”] 高阶函数–转化为string
a.map(Number); //(3) [1, 2, 3]
a.reduce(function(x,y){return x*2+y}); //11
var b=new Map();
b.set(undefined,1) //Map(1) {undefined => 1}
b.set(null,2) //Map(2) {undefined => 1, null => 2}
b.set(‘oo’,11) //Map(3) {undefined => 1, null => 2, “oo” => 11}

map对象还包含values()、keys()、entries()方法,
b.size //3
[…b.values()] //(3) [1, 2, 11]
[…b.keys()] //(3) [undefined, null, “oo”]
[…b.entries()] //(3) [Array(2), Array(2), Array(2)]0: (2) [undefined, 1]1: (2) [null, 2]2: Array(2)0: "oo"1: 11length: 2__proto__: Array(0)length: 3__proto__: Array(0)
[…b] //(3) [Array(2), Array(2), Array(2)]

Set是只有键名的集合也可以说set集合里的键名就是键值。set集合的元素唯一、不可重复且无序。方法有add()、has()、delete()、以及遍历集合的forEach()**。
var s=new Set([2,3,4]);
s.forEach(function(ele,index,array){console.log(ele)})
s.add(undefined) //Set(4) {2, 3, 4, undefined}
s.has(undefined) //true
s.delete(undefined) //true
s.has(undefined) //false

数组扩展符三个点(… )
将数组转为用逗号分隔的参数序列。
eg: […b.keys()] b.keys()是一个数组,…可将其变为以逗号分开的单个参数的序列。
用例:将一个数组添加到另外一个数组的尾部【一般是循环然后利用数组的push方法】
es5中利用Array.prototype.push.apply(arr1, arr2)即可完成数组尾部添加数组
es6中 arr1.push(…arr2);即可完成。

var d1=[1,2,3];
var d2=[4,5,6];
Array.prototype.push.call(d,...d2); //返回结果为数组的长度6,且原数组已经改变,因为push方法会改变原数组
Array.prototype.push.apply(d,d2);   //返回结果为数组长度9,原数组d为[1, 2, 3, 4, 5, 6, 4, 5, 6]

push方法的参数为单个参数!

复制数组
数组为复杂对象,若var arr1=[1,2,3]; var arr2=arr1; 此时的arr2和arr1指向同一个数据内存,修改arr1,arr2也会相应改变。
怎么解决这种克隆版本不影响原数组呢?
es5中 var arr1=[1,2]; var arr2=arr1.concat(); arr1.push(3); arr2;//[1,2]
arr1的改变不影响arr2。concat()方法返回了一个数组的copy。
es6的写法 var arr1=[1,2]; var arr2=[…arr1]; arr1和arr2互不影响。

猜你喜欢

转载自blog.csdn.net/Qian_mos/article/details/88316416