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()
的区别。
先看上面那段:
let arr = [];
for (let f of [Symbol, Symbol.for]) {
for (let v of [undefined, 'undefined']) {
arr.push(f(v))
}
}
分别枚举[Symbol, Symbol.for]
、[undefined, 'undefined']
,生成四个元素,排列组合看出是这四个:
Symbol(undefined) => Symbol()
Symbol('undefined') => Symbol(undefined)
Symbol.for(undefined) => Symbol(undefined)
Symbol.for('undefined') => Symbol(undefined)
再来看下面那段:
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])
}
}
虽然res是一维数组,很明显是那四个元素相互比较的矩阵,但是只取了下三角(还不包括对角线),再拉成一维数组了。改成这样,会更方便观看吧:
let res = [[]];
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
res[i][j] = arr[i] === arr[j];
}
}
运算结果是这样的:
| true | false | false | false |
| false| true | false | false |
| false| false | true | true |
| false| false | true | true |
那么体现了什么性质呢,即两者有没有登记机制:
-
就算输入是一样的,但是对于Symbol都是不同的,每一个Symbol都是独一无二的。
Symbol(undefined) === Symbol(undefined) => false
-
Symbol.for()的操作是有登记机制的,就是说它将首先搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。
Symbol.for(undefined) === Symbol.for(undefined) => true
-
Symbol.for()将只会登记以它生成的Symbol变量,直接用Symbol()生成的不会登记,即:
Symbol(undefined) === Symbol.for(undefined) => false
调用Symbol
和Symbol.for
,分别传入undefined
和'undefined'
,然后两两比较生成的值
检验arr里面的四个元素是否互相相等啊,把相等的输出。根据我的猜测,smybol每一个都不一样,symbol.for是全局注册,要求key是string,undefined直接输入不知道会产生什么情况,但'undefined'可以注册,能正常注册和取出,因此,res应该有一个 [ symbol(undefined) ]