Symbol
- 每个Symbol都是独一无二的
Symbol() !== Symbol()
- Symbol 不能进行运算
- Symbol可以转化成String
Symbol('Desc').toString() === 'Symbol(Desc)'
- Symbol 可以转化成Boolean,始终是true
!!Symbol() === true
- Symbol.for() 全局登记Symbol值
Symbol(desc) // 生成独一无二的Symbo�l值 Symbol.for(desc)//相同的desc只会生成一个Symbol值,多次调用指向同一个值
- Symbol.keyFor(Symbol) 返回已登记的Symbol的key,Symbol.for()生成的Symbol才会有登记记录,
Symbol.keyFor(Symbol.for('key')) // 'key' Symbol.keyFor(Symbol()) // undefined
- 内置Symbol
- Symbol.hasInstance
foo instanceOf Foo // 实际调用 Foo[Symbol.hasInstance](foo)
- Symbol.isConcatSpreadable,在进行concat操作时,遇到数组或者类数组对象是否展开,true/展开,false/不展开,数组默认展开,类数组对象默认不展开
- Symbol.species 创建衍生对象时,使用的构造函数
class MyArray extends Array {} const a = new MyArray(1, 2, 3); const b = a.map(x => x); b instanceof MyArray // true b instanceof Array // true class MyArray2 extends Array { static get [Symbol.species]() { return Array; } } const a2 = new MyArray2(); const b2 = a2.map(x => x);// b2是创建的衍生对象 b2 instanceof MyArray // false b2 instanceof Array // true
- Symbol.match,Symbol.replace,Symbol.search,Symbol.split,正则表达式对象部署这几个属性,在进行对应操作时调用相应属性指向的方法
- Symbol.iterator 指向遍历器,部署这个属性的对象都可遍历
- Symbol.toPrimitive 对象转成数字或者字符串时调用
let obj = { [Symbol.toPrimitive](hint) { switch (hint) { case 'number': return 123; case 'string': return 'str'; case 'default': return 'default'; default: throw new Error(); } } }; 2 * obj // 246 3 + obj // '3default' obj == 'default' // true String(obj) // 'str'
- Symbol.toStringTag 对象调用toString时定制返回名称
[Object xxx]
- Symbol.unscopables 使用with命令时,排除的对象属性
网友评论