首页 > 看不懂这段JS在算什么?

看不懂这段JS在算什么?

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 |

那么体现了什么性质呢,即两者有没有登记机制:

  1. 就算输入是一样的,但是对于Symbol都是不同的,每一个Symbol都是独一无二的。

    Symbol(undefined) === Symbol(undefined) => false
  2. Symbol.for()的操作是有登记机制的,就是说它将首先搜索有没有以该参数作为名称的Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。

    Symbol.for(undefined) === Symbol.for(undefined) => true
  3. Symbol.for()将只会登记以它生成的Symbol变量,直接用Symbol()生成的不会登记,即:

    Symbol(undefined) === Symbol.for(undefined) => false

调用SymbolSymbol.for,分别传入undefined'undefined',然后两两比较生成的值


检验arr里面的四个元素是否互相相等啊,把相等的输出。根据我的猜测,smybol每一个都不一样,symbol.for是全局注册,要求key是string,undefined直接输入不知道会产生什么情况,但'undefined'可以注册,能正常注册和取出,因此,res应该有一个 [ symbol(undefined) ]

【热门文章】
【热门文章】