《深入理解ES6》之Symbol
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《深入理解ES6》之Symbol相关的知识,希望对你有一定的参考价值。
ES6在原有的5中原始类型:字符串、数字型、布尔型、null和undefined的基础上,引入了一种原始类型Symbol(可以通过typeof检测变量是否为Symbol类型)。
Symbol的使用方法
所有使用可计算属性名的地方,都可以使用Symbol。
let firstName=Symbol("first name"); let person={ [firstName]:"jia" }; Object.defineProperty(person,firstName,{writable:false}); let lastName=Symbol("last name"); Object.defineProperties(person,{ [lastName]:{ value:"nuo", writable:false } }); console.log(person[firstName]);//jia console.log(person[lastName]);//nuo
Symbol共享体系
ES6提供了可以随时访问的全局Symbol注册表,使用Symbol.for()方法。它只接受一个参数。可以用Symbol.keyFor()方法在Symbol全局注册表中检索与Symbol有关的键。
let uid=Symbol.for("uid"); let object={ [uid]:"12345" }; console.log(object[uid]);//12345 console.log(uid);//Symbol(uid) let uid2=Symbol.for("uid"); console.log(uid===uid2);//true console.log(object[uid2]);//12345 console.log(uid2);//Symbol(uid) console.log(Symbol.keyFor(uid));//uid console.log(Symbol.keyFor(uid2));//uid let uid3=Symbol("uid"); console.log(Symbol.keyFor(uid3));//undefined
Symbol与强制类型转换
其它类型没有与Symbol逻辑等价的值。所以将Symbol与字符串拼接或者与数字运算都会报错。使用console.log()方法来输出Symbol的内容,它会调用Symbol的String()方法并输出有用的信息。
let uid=Symbol.for("uid"), desc=String(uid); console.log(desc);//Symbol(uid) sum=desc/1;//报错 sum2=desc+"";//报错
well-known Symbol操作
well-known Symbol | 详细意思 |
Symbol.hasInstance | 一个在执行instanceof时调用的内部方法,用于检测对象的继承信息。 |
Symbol.isConcatSpreadable | 一个布尔值,用于表示当传递一个集合作为Array.prototype.concat()方法的参数时,是否应该讲集合内的元素规整到同一个层级。 |
Symbol.iterator | 一个返回迭代器的方法。 |
Symbol.match | 一个在调用String.prototype.match()方法时调用的方法,用于比较字符串。 |
Symbol.replace | 一个在调用String.prototype.replace()方法时调用的方法,用于替换字符串的子串。 |
Symbol.search | 一个在调用String.prototype.search()方法时调用的方法,用于在字符串中定位子串。 |
Symbol.species | 用于创建派生类的构造函数 |
Symbol.split | 一个在调用String.prototype.split()方法时调用的方法,用于在字符串中定位子串 |
Symbol.toPrimitive | 一个返回对象原始值的方法 |
Symbol.toStringTag | 一个在调用Object.prototype.toString()方法时使用的字符串,用于创建对象描述 |
Symbol.unscopables | 一个定义了一些不可被with语句引用的对象属性名称的对象集合 |
数字模式有以下特性,根据优先级的顺序排列:
- 调用valueOf()方法,如果结果为原始值,则返回。
- 否则,调用toString方法,如果结果为原始值,则返回。
- 如果再无可选值,则抛出错误。
字符串模式有以下优先级排序:
- 调用toString()方法,如果结果为原始值,则返回。
- 否则,调用valueOf()方法,如果结果为原始值,则返回。
- 如果再无可选值,则抛出错误。
以上是关于《深入理解ES6》之Symbol的主要内容,如果未能解决你的问题,请参考以下文章