Symbol
Symbol用法,提供一个独一无二的值,用Symbol声明的值,不重复不相等
{
// 没有使用new,而是当函数使,
let a1 = Symbol();
let a2 = Symbol();
console.log(a1===a2); // false
// Symbol.for(key)先确定在全局范围内是不是有注册了该值,如果没有的话,就取调用Symbol()生成独一无二的值
let a3=Symbol.for('a3');
let a4=Symbol.for('a3');
console.log(a3===a4); // true
}
{
let a1=Symbol.for('abc');
let obj={
[a1]:'123',
'abc':345,
'c':456
};
// 考虑问题,都是abc的属性,是不是重复了呢
console.log('obj',obj);// {abc:345,c:456,Symbol(abc):"123"}
// 如果对象中有用Symbol作为属性(key)的,for--of--,for--in--是拿不到key值的,只拿到了非Symbol得key-value
for(let [key,value] of Object.entries(obj)){
console.log('let of',key,value);
}
// 结果是 let of abc 345
// 结果是 let of c 456
// 这个方法就可以取到Symbol作为属性(key)的值啦,只拿到了Symbol得key-value
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(obj[item]);// 123
})
// 既拿到Symbol得key-value,又拿到非Symbol得key-value
Reflect.ownKeys(obj).forEach(function(item){
console.log('ownkeys',item,obj[item]);
})
// ownkeys abc 345
// ownkeys c 456
// ownkeys Symbol(abc) 123
}
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
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
