《深入理解ES6》之Symbol

Posted

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语句引用的对象属性名称的对象集合

数字模式有以下特性,根据优先级的顺序排列:

  1. 调用valueOf()方法,如果结果为原始值,则返回。
  2. 否则,调用toString方法,如果结果为原始值,则返回。
  3. 如果再无可选值,则抛出错误。

字符串模式有以下优先级排序:

  1. 调用toString()方法,如果结果为原始值,则返回。
  2. 否则,调用valueOf()方法,如果结果为原始值,则返回。
  3. 如果再无可选值,则抛出错误。

 

以上是关于《深入理解ES6》之Symbol的主要内容,如果未能解决你的问题,请参考以下文章

深入理解ES6之《用模块封装代码》

理解ES6中的Symbol

深入理解BSS(Block Started by Symbol)

深入理解ES6之《ES6中较小的改动》

深入理解ES6之《ES6中较小的改动》

深入理解ES6之《函数》