JavaScript 标准内置对象——Symbol
前言
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