likes
comments
collection
share

JavaScript 标准内置对象——Symbol

作者站长头像
站长
· 阅读数 16

前言

symbol 是一种基本数据类型。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。

每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。


const a = Symbol();
const b = Symbol(15);
const c = Symbol('function');

console.log(typeof a);
// expected output: "symbol"

console.log(b === 15);
// expected output: false

console.log(c.toString());
// expected output: "Symbol(function)"

console.log(Symbol('function') === Symbol('function'));
// expected output: false


Symbol.prototype.description

创建 Symbol 的时候,可以添加一个描述。

const sym = Symbol('foo');

上面代码中,sym的描述就是字符串foo

但是,读取这个描述需要将 Symbol 显式转为字符串,即:

const sym = Symbol('foo');

String(sym) // "Symbol(foo)"
sym.toString() // "Symbol(foo)"

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

const sym = Symbol('foo');

sym.description // "foo"

symbol 属性

  • Symbol.length

  • 长度属性,值为0。

迭代 symbols

  • Symbol.iterator :一个返回一个对象默认迭代器的方法。被 for...of 使用。

  • Symbol.asyncIterator:一个返回对象默认的异步迭代器的方法。被 for await of 使用。

正则表达式 symbols

  • Symbol.match:一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 String.prototype.match() 使用。

  • Symbol.replace:一个替换匹配字符串的子串的方法. 被 String.prototype.replace() 使用。

  • Symbol.search: 一个返回一个字符串中与正则表达式相匹配的索引的方法。被String.prototype.search() 使用。

  • Symbol.split: 一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 String.prototype.split()使用。

  • Symbol.unscopables: 指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。
Array.prototype[Symbol.unscopables]
// {
//   copyWithin: true,
//   entries: true,
//   fill: true,
//   find: true,
//   findIndex: true,
//   includes: true,
//   keys: true
// }

Object.keys(Array.prototype[Symbol.unscopables])
// ['copyWithin', 'entries', 'fill', 'find', 'findIndex', 'includes', 'keys']

上面代码说明,数组有 7 个属性,会被with命令排除。

// 没有 unscopables 时
class MyClass {
  foo() { return 1; }
}

var foo = function () { return 2; };

with (MyClass.prototype) {
  foo(); // 1
}

// 有 unscopables 时
class MyClass {
  foo() { return 1; }
  get [Symbol.unscopables]() {
    return { foo: true };
  }
}

var foo = function () { return 2; };

with (MyClass.prototype) {
  foo(); // 2
}

上面代码通过指定Symbol.unscopables属性,使得with语法块不会在当前作用域寻找foo属性,即foo将指向外层作用域的变量。

转载自:https://juejin.cn/post/7098618693969838093
评论
请登录