本文最后更新于:2020-05-08 20:26:39

1.ES6新增基本数据类型

自ECMAScript 2015起,symbol成为了一种新的原生类型,表示独一无二的值。就像numberstring一样。它是 JavaScript 语言的第七种数据类型,前六种是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。symbol类型的值是通过Symbol构造函数创建的。

let sym1 = Symbol();
let sym2 = Symbol("key"); // 可选的字符串key

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。

如何访问Symbol的描述,如上及如何访问到 “key”

ES2019 提供了一个实例属性description,直接返回 Symbol 的描述。

const sym = Symbol('key');
sym.description // "key"

2.Symbol是不可改变且唯一的

// 无参数的情况
let sym2 = Symbol();
let sym3 = Symbol();

sym2 === sym3; // false, symbol是唯一的

// 有参数的情况
let s1 = Symbol('foo');
let s2 = Symbol('foo');

s1 === s2 // false, symbol是唯一的

3.Symbol 值不能与其他类型的值进行运算

let sym = Symbol('My symbol');

"your symbol is " + sym   // TypeError: can't convert symbol to string
`your symbol is ${sym}`   // TypeError: can't convert symbol to string

但是,Symbol 值可以显式转为字符串。

let sym = Symbol('My symbol');

String(sym) // 'Symbol(My symbol)'
sym.toString() // 'Symbol(My symbol)'

Symbol 值也可以转为布尔值,但是不能转为数值。

let sym = Symbol();
Boolean(sym) // true
!sym  // false

if (sym) {
  // ...
}

Number(sym) // TypeError
sym + 2 // TypeError

4.Symbol可以被用做对象属性的键

let sym1 = Symbol();
let obj = {
    [sym1]: "value"
};

console.log(obj[sym1]); // "value"

5.Symbol可以与计算出的属性名声明相结合来声明对象的属性和类成员

const sym = Symbol();

class Abc {
    [sym](){
       return "ABC";
    }
}

let c = new Abc();
let className = c[sym](); // "ABC"

6.内置的 Symbol 值

参考:https://es6.ruanyifeng.com/#docs/symbol#%E5%86%85%E7%BD%AE%E7%9A%84-Symbol-%E5%80%BC


技术      TS

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!