javascript - 看不懂这段JS在算什么?
天蓬老师
天蓬老师 2017-04-11 11:30:18
[JavaScript讨论组]
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)

如题……它想要算什么?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
怪我咯

这段代码主要是体现了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) ]

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号