Es6(Symbol,set,map,filter)

2023-04-27,,

首先再讲这几个新东西之前,先说一个Es6中新出的扩展运算符(...)

1.展开运算符,就是把东西展开,可以用在array和object上

比如:

let a=[,]
let b=[,...a,]//[0,1,2,3]

第二个是剩余操作符,是解构的一种,把剩余的东西放到一个array里面赋值给他,一般只针对array的解构

let a=[,,]
let [b,...c]=a;//b:1,c:[2,4]
let a=[,,]
let [b,...[c,d,e]]=a;//b:1,c:2,d:3,e:undefined

Symbol

Symbol是一个新的基本数据类型,而且是一个值类型的

使用Symbol函数执行得到一个Symbol数据类型

Symbol跟字符串差不多,但是使用Symbol函数得到一个数据,每一个是完全不同的

Symbol可以接受一个参数()是对这个symbol数据的描述

即使描述一样但是,值也是不同

一般当做对象的属性,任意一个Symbol()得到的值都是不同的

   let sym1=Symbol();
let sym2=Symbol();
console.log(typeof sym1);//symbol
console.log(typeof sym1);//symbol
console.log(sym1===sym2);//false

symbol值不可以跟其他值计算,即不可以转为数字,也不可以进行字符串的拼接,但是可以转为布尔值,也可以调用toString方法,显示字符串

     let obj={
sym1:"jeo",[sym1]:"jack"}
console.log(obj);
obj[sym2]="rose";
console.log(obj);
console.log(Symbol("js").toString());//返回一个Symbol类型的字符串

Symbol.for()如果之前有相同参数的Symbol的值,找到这个值返回,如果没有就创建一个新的Symbol值

使用Symbol.for()参数相同,值就是相同

 let s1=Symbol.for("js")
let s2=Symbol.for("js")
console.log(s1==s2);//true

Symbol.keyFor(symbol值)找到使用Symbol.for创建的值的描述

console.log(Symbol.keyFor(s1));//js

Set

- 类似数组,只有值value,没有键key

- 通过构造函数方式创建一个Set实例(对象)

- 参数是一个数组(或者是类似数组,只是有iterable接口)

- 有iterable接口:数组,arguments,元素集合,set,map,字符串

- 默认去重

 console.log(new Set([,,,]));//Set(4) {1, 2, 3, 4}
console.log(new Set(""));//Set(4) {"1", "2", "3", "4"}
function fn(){
console.log(new Set(arguments))
}
fn(,,,)//Set(4) {1, 2, 3, 4}

- size set实例大小的个数

- add(如果之前有就加上,如果没有就不增加,返回值是增加后的实例,参数默认增加一个) clear(清空,没有返回值,undefined,没有参数) delete(返回布尔值) has(判断有没有此项,返回值true/false)

//add可以实现链式写法
let set1=new Set([,,])
console.log(set1.add().add());

- forEach(遍历)

let set1=new Set([1,2,3]);

set1.forEach((...rest)=>{

    console.log(rest);

})
let set1=new Set([,,]);

set1.forEach((item, index,input)=>{
//set实例只有value没有key
//item,index:当前项value
//input:当前set实例 })

- keys

let set1=new Set([1,2,3]);

for(let key of set1.keys()){
//拿到的还是value值
console.log(key);
}

- values

let set1=new Set([,,]);

for(let val of set1.values()){

     console.log(val);
}

-  entries(拿到的是value值)

let set1=new Set([,,]);

for(let [item,val] of set1.entries()){
//item,val都是value值
console.log(item,val); }

应用场景:

1.数组去重

      let arr=[,,,,,,,,];
function arrPure(arr){
// return [...new Set(arr)];
return Array.from(new Set(arr))
}
arr=arrPure(arr);
console.log(arr);

2.求两个集合的并集

 let a=[,,,,,,];
let b=[,,,,,,];
function add(a,b){
let arr=[...a,...b];
console.log(...new Set(arr));
}
add(a,b)

3.求两个集合的交集

function same(a,b){
return a.filter(item=>b.includes(time))

4.求两个集合的差集

function diff(a,b){
return a.filter(item=>!b.includes(item))+b.filter(item=>!a.includes(item))

Map

- 构造函数创建一个Map实例,返回一个

- new Map([[key,value],[]])

- 参数是一个数组,数组每一项也是一个数组,有两项key,value

- 一个对象 属性名必须是字符串,如果你写的不是字符串也默认转为字符串

let ary=[1,2],o={};
let obj={
name:'jeo',
ary,
[o]:o,
}
console.log(obj)
/**
*{name: "jeo", ary: Array(2), [object Object]: {…}}
[object Object]: {}
ary: (2) [1, 2]
name: "jeo"
__proto__: Object
*/

- Map实例的key可以是任意数据类型

let m1=new Map([[1,"jeo"],[true,'rose'],[{name:"jack"},{name:23}]])
console.log(m1)

size:键值对的个数

let m1=new Map([[,"jeo"],[true,'rose'],[{name:"jack"},{name:}]])
m1.get()//jeo

get(获取值),set(可以实现链式写法),has判断key有没有对应的value,有就是true,没有就是false

let m1=new Map([[1,"jeo"],[true,'rose'],[{name:"jack"},{name:23}]])
m1.forEach((key,value,input)=>
{
console.log(key)
console.log(value)
console.log(input)
})//key是属性名,value是属性值,input是Map实例

给定一个数组变成Map实例

let arr=['js','vue','react','node']
let m1=new Map();
for(let [index,item] arr.entries()){
m1.set(index, item)}
console.log(m1);/*Map(4) {0 => "js", 1 => "vue", 2 => "react", 3 => "node"}
size: (...)
__proto__: Map
[[Entries]]: Array(4)
0: {0 => "js"}
1: {1 => "vue"}
2: {2 => "react"}
3: {3 => "node"}
length: 4
*/

map():

map和forEach等遍历方法不同,在forEach中return语句是没有任何效果的,而map则可以改变当前循环的值,返回一个新的被改变过值之后的数组,一般用来处理需要修改某一个数组的值

filter用于吧Array的某些元素过滤掉,然后返回剩下的元素(filert()接收一个函数,把传入的函数依次作用域每个元素,然后在根据返回值是true还是false决定保留还是丢弃元素)

- 用filter选择数组中的奇数

function filterUse(){
let arr=[,,,,,];
var r=arr.filter(x=>x%!==)
console.log(r); }
filterUse();

- 利用filter实现去除重复元素,思想是:indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。

  function filterUse(){
let arr=[1,2,3,7,9,3];
let r=arr.filter(function(element,index,self){
return self.indexOf(element)===index;
})
console.log(r);
}
filterUse();

Es6(Symbol,set,map,filter)的相关教程结束。

《Es6(Symbol,set,map,filter).doc》

下载本文的Word格式文档,以方便收藏与打印。