es6symbol

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// symbol
// 这种数据类型提供了独一无二的类型
{
// 声明
let a1 = Symbol()
let a2 = Symbol()
console.log(a1 === a2);

let a3 = Symbol.for('a3')//这种声明方法,会先检查a3是否有全局声明,如果有返回a3,没有则返回Symbol
let a4 = Symbol.for('a3')// 这个时候的a3是声明了的,所以返回的是之前声明过的a3
console.log(a3 === a4);
}
// false true

{
let a1 = Symbol.for('abc')
let obj = {
[a1]: '123',
'abc': '345',
'c': 456
}
console.log(obj);

for(let [key,val] of Object.entries(obj)) {
console.log(key, val);
}

Object.getOwnPropertySymbols(obj).forEach(e => {
console.log(e, obj[e]);
})

Reflect.ownKeys(obj).forEach(e => {
console.log(e, obj[e]);
})
}
//{abc: "345", c: 456, Symbol(abc): "123"} 这样申明的Symbol(abc)不会被覆盖,但是for in, let of 拿不到该属性

// abc 345
// c 456

// Symbol(abc) 123

// abc 345
// c 456
// Symbol(abc) 123