小编And*_*lev的帖子

使用 Symbol.for('string') 代替普通字符串有什么好处

当我使用这样的代码时:

const sym = Symbol('toAvoidInterference');
document.querySelector('#someid')[sym] = 'Hello, world!';
Run Code Online (Sandbox Code Playgroud)

避免干扰其他属性名称是有意义的。但使用有什么区别和好处:

const sym = Symbol.for('attributeName');
document.querySelector('#someid')[sym] = 'Hello, world!';
Run Code Online (Sandbox Code Playgroud)

如果是一样的话我们可以这样写:

document.querySelector('#someid')['attributeName'] = 'Hello, world!';
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,另一个开发人员可能会使用同名的属性,尽管它被包装到or notfor的方法中Symbol,因为我们无法确定该字符串是唯一的。为什么需要使用 Symbol.for() 而不是使用纯字符串?

UPD。我突然发明了call这个最有用的功能Symbol.for()。如果代码中存在使用符号,有时在调试时很难使用条件断点。例如,您需要捕获变量是否等于符号类型的值并且该值绑定在不同的模块中。第一个困难的方法是使用该值作为常量并将其从该模块导出。在这种情况下,断点的条件将如下所示:

catchedVariable === exportedSymbolConst
Run Code Online (Sandbox Code Playgroud)

但最简单的方法是暂时更改模块内的代码添加.forSymbol. 然后你可以写出条件:

catchedVariable === Symbol.for('string_key')
Run Code Online (Sandbox Code Playgroud)

成功调试后,您将把代码改回只是删除.for部分。

javascript string symbols ecmascript-6

6
推荐指数
1
解决办法
841
查看次数

如何理解类型 any、unknown、{} 之间以及它们与其他类型之间的关系?

试图理解类型之间的关系我有这个代码

type CheckIfExtends<A, B> = A extends B ? true : false;

type T1 = CheckIfExtends<number, unknown>; //true
type T2 = CheckIfExtends<number, {}>; //true
type T3 = CheckIfExtends<number, any>; //true
type T4 = CheckIfExtends<() => void, unknown>; //true
type T5 = CheckIfExtends<() => void, {}>; //true
type T6 = CheckIfExtends<() => void, any>; //true
type T7 = CheckIfExtends<unknown, any>; //true
type T8 = CheckIfExtends<any, unknown>; //true
type T9 = CheckIfExtends<{}, unknown>; //true
type T10 = CheckIfExtends<{}, any>; //true
type T11 …
Run Code Online (Sandbox Code Playgroud)

types typescript

6
推荐指数
1
解决办法
411
查看次数

标签 统计

ecmascript-6 ×1

javascript ×1

string ×1

symbols ×1

types ×1

typescript ×1