因为一个数组取差集的需求,搜索答案中顺便学习了下es6的新语法,自己总结了下,感觉很有意义,希望对您有所帮助。
首先介绍下let,与var类似,但用let声明的变量的作用域只是外层块,而不是整个外层函数。
以下代码中还用到了set(一群值的集合,与数组类似)。
//let setOfWords1 = new Set([1, 2, 3]);
//let setOfWords2 = new Set([3, 5, 2]);
var Array1 = [5,6,7,8,18,9,90,81];
var Array2 = [10,415,54,87,98,65,81];
let a = new Set(Array1);
let b = new Set(Array2);
// 并集
let unionSet = new Set([...a, ...b]);
// set转化为数组
let unionSet1 = Array.from(unionSet);
console.log(unionSet1);
// 交集
let intersectionSet = new Set([...a].filter(x => b.has(x)));
// set转化为数组
let intersectionSet1 = Array.from(intersectionSet);
console.log(intersectionSet1);
// 差集
let differenceABSet = new Set([...a].filter(x => !b.has(x)));
// set转化为数组
let differenceABSet1 = Array.from(differenceABSet);
console.log(differenceABSet1);
以下为es6常用关键字的简介总结。
关键字let
let声明的变量拥有块级作用域。也就是说用let声明的变量的作用域只是外层块,而不是整个外层函数。
let声明的全局变量不是全局对象的属性。这就意味着,你不可 以通过window.变量名的方式访问这些变量。它们只存在于一个不可见的块的作用域中,这个块理论上是Web页面中运行的所有JS代码的外层块。
形如for (let x…)的循环在每次迭代时都为x创建新的绑定。
let声明的变量直到控制流到达该变量被定义的代码行时才会被装载,所以在到达之前使用该变量会触发错误。
用let重定义变量会抛出一个语法错误(SyntaxError)。
关键字const
const声明的变量与let声明的变量类似,它们的不同之处在于,const声明的变量只可以在声明时赋值,不可随意修改,否则会导致SyntaxError(语法错误)。
关键字set
一个Set是一群值的集合。它是可变的,能增删元素。与数组区别如下:
一个Set不会包含相同元素,重复加入已有元素不会产生效果。
包含性检测。
var setOfWords = new Set([1, 2, 3, "zythum"]);
arrayOfWords = [1, 2, 3, "zythum"];
//判断set集合中是否包含“zythum”
setOfWords.has("zythum") // 查询速度快
true
//判断数组中是否包含“zythum”
arrayOfWords.indexOf("zythum") !== -1 // 查询速度慢
true
不提供索引
以下是Set支持的所有操作:
- new Set:创建一个新的、空的Set。
- new Set(iterable):从任何可遍历数据中提取元素,构造出一个新的集合。
- set.size:获取集合的大小,即其中元素的个数。
- set.has(value):判定集合中是否含有指定元素,返回一个布尔值。
- set.add(value):添加元素。如果与已有重复,则不产生效果。
- set.delete(value):删除元素。如果并不存在,则不产生效果。.add()和.delete()都会返回集合自身,所以我们可以用链式语法。
- setSymbol.iterator:返回一个新的遍历整个集合的迭代器。一般这个方法不会被直接调用,因为实际上就是它使集合能够被遍历,也就是说,我们可以直接写for (v of set) {…}等等。
- set.forEach(f):直接用代码来解释好了,它就像是for (let value of set) { f(value, value, set); }的简写,类似于数组的.forEach()方法。
- set.clear():清空集合。
- set.keys()、set.values()和set.entries()返回各种迭代器,它们是为了兼容Map而提供的,所以我们待会儿再来看。
关键字map
一个Map对象由若干键值对组成,是一种更完善的Hash结构实现,类似于对象中的键值对应:
var m = new Map();
m.set(o: "content");
var o = {p: "Hello World"};
- new Map:返回一个新的、空的Map。
- new Map(pairs):根据所含元素形如[key, value]的数组pairs来创建一个新的Map。这里提供的pairs可以是一个已有的Map 对象,可以是一个由二元数组组成的数组,也可以是逐个生成二元数组的一个生成器,等等。
- map.size:返回Map中项目的个数。
- map.has(key):测试一个键名是否存在,类似key in obj。
- map.get(key):返回一个键名对应的值,若键名不存在则返回undefined,类似obj[key]。
- map.set(key, value):添加一对新的键值对,如果键名已存在就覆盖。
- map.delete(key):按键名删除一项,类似delete obj[key]。
- map.clear():清空Map。
- mapSymbol.iterator:返回遍历所有项的迭代器,每项用一个键和值组成的二元数组表示。
- map.forEach(f) 类似for (let [key, value] of map) { f(value, key, map); }。这里诡异的参数顺序,和Set中一样,是对应着Array.prototype.forEach()。
- map.keys():返回遍历所有键的迭代器。
- map.values():返回遍历所有值的迭代器。
- map.entries():返回遍历所有项的迭代器,就像mapSymbol.iterator。实际上,它们就是同一个方法,不同名字。