let arr = [];
for (let f of [Symbol, Symbol.for]) {
for (let v of [undefined, 'undefined']) {
arr.push(f(v))
}
}
let res = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
res.push(arr[i] === arr[j])
}
}
console.log(res)
如题……它想要算什么?
这段代码主要是体现了
Symbol()
和Symbol.for()
的区别。先看上面那段:
分别枚举
[Symbol, Symbol.for]
、[undefined, 'undefined']
,生成四个元素,排列组合看出是这四个:再来看下面那段:
虽然res是一维数组,很明显是那四个元素相互比较的矩阵,但是只取了下三角(还不包括对角线),再拉成一维数组了。改成这样,会更方便观看吧:
运算结果是这样的:
| true | false | false | false |
| false| true | false | false |
| false| false | true | true |
| false| false | true | true |
那么体现了什么性质呢,即两者有没有登记机制:
就算输入是一样的,但是对于Symbol都是不同的,每一个Symbol都是独一无二的。
Symbol.for()的操作是有登记机制的,就是说它将首先搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
Symbol.for()将只会登记以它生成的Symbol变量,直接用Symbol()生成的不会登记,即: