Set
- 类似于数组,但是成员的值都是唯一的,没有重复的值
for-of可以用于遍历Map和Set,for-in不行
ps: set内部两个NaN是相等的
- 方法: const s = new Set()
-
s.add()
add方法返回的是当前的Map对象,因此可以采用链式写法 -
s.delete()
-
s.has()
-
s.clear()
-
s.keys()
- Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致
- s.values()
- s.entries()
- entries方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。
ps:Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法,所以可以省略values方法,直接用for…of循环遍历 Set
summary:
操作方法: add、delete、has、clear
遍历set: for(value of s){}
- Set可以使用filter、map和has方法
let a = new Set([1,4,6,7])
let b = new Set([4,5,8,1])
// 并集
let union = new Set([...a,...b])
// 交集
let intersect = new Set([...a].filter(x => b.has(x)))
// (a相对b)差集
let difference = new Set([...a].filter(x => !b.has(x)))
Map
- 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size // 2
map.get('name') // "张三"
map.get('title') // "Author"
- undefined和null是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键
- 操作方法 const m = new Map()
- m.size()
- m.set()
- m.get()
set方法返回的是当前的Map对象,因此可以采用链式写法 - m.has()
- m.delete()
- m.clear()
- m.keys()
- m.values()
- m.forEach()
- Map 本身没有map和filter方法
Object.entries()
- 返回一个给定对象自身可枚举属性的键值对数组
const obj = {
name:'zhang',age:12,sex:'man'}
Object.entries(obj)
// [['name','zhang'],['age',12],['sex','mane']]
解构赋值
- 由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构
let arr = [1,2,4];
let {
0:first,[arr.length-1]:last} = arr
// first : 1
// last : 4
- 对于已声明的变量
// 错误的写法
let x;
{
x} = {
x: 1}; // 因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题
// 正确的写法
let x;
({
x} = {
x: 1});
- 字符串的结构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
let {
length : len} = 'hello';
len // 5
- 交换变量的值
let x = 1;
let y = 2;
[x, y] = [y, x];