# Symbol

Symbol 在 JavaScript 里面是一种原始基本数据类型,每一个 Symbol 值都是唯一的。

通过Symbol()获取一个 Symbol 值,不支持new Symbol()调用。

# 获取对象的 Symbol 属性集合

Object.getOwnPropertySymbols(obj)

# 静态方法

# Symbol.for([str])

使用一个字符串生成一个全局共享的 Symbol 值

var symbol = Symbol.key("foo");
1

# Symbol.keyFor(symbol: Symbol)

获取生成 Symbol 值的字符串

var foo = Symbol.keyForm(symbol);
console.log(foo); // 'foo'
1
2

# 静态属性

# Symbol.length

Symbol 的长度,返回 0

# Symbol.prototype

Symbol 的原型对象

# 内建的 Symbol

# 迭代 Symbol

  • Symbol.iterator

作为可迭代对象的 Symbol 属性,指定了该属性的对象可以使用for...of迭代访问

# 正则表达式 Symbol

  • Symbole.match

RegExp.prototype的 Symbol 属性,被String.prototype.match调用

  • Symbole.search

RegExp.prototype的 Symbol 属性,被String.prototype.search调用

  • Symbole.replace

RegExp.prototype的 Symbol 属性,被String.prototype.replace调用

  • Symbole.split

RegExp.prototype的 Symbol 属性,被String.prototype.split调用

# 其他 Symbol

  • Symbol.hasInstance

instanceof调用

obj instanceof Obj;
// 等同于调用
Obj[Symbol.hasInstance](obj);
1
2
3
  • Symbol.isConcatSpreadable

定义Array.prototype.concat()调用时是否展开对象或者数组。

  • Symbol.unscopables
  • Symbol.species
  • Symbol.toPrimitive
  • Symbol.toStringTag

# 面试

  • 为什么不支持new Symbol()的调用?

围绕原始数据类型的包装对象从 ECMAScript 2015 不再受支持。因为保持向前兼容,保留以前的new String()new Boolean()new Number()方法

  • 怎样阻止使用new创建实例?

在函数内部使用new.target,如果使用new调用函数,则new.target等于函数,否则等于undefined

最后更新: 3/1/2021, 8:31:48 PM