新的原始数据类型
在原有的六种数据类型(Undefined、Null、Boolean、String、Number、Object)的基础上,新增的代表一个独一无二的值的新的原始数据类型Symbol。
var s = Symbol([key])
不能使用new,会报错
let b = new Symbol();
//result: Uncaught TypeError: Symbol is not a constructor
参数key
Symbol([key])函数的参数可选,是用来对Symbol实例进行描述,对不同的Symbol类型以更明确的区分。
这个描述Symbol类型的参数是字符串,如果不是字符串,Symbol会调用参数的toString()函数将其转为字符串,但是不建议使用无含义的描述。这个参数即使是相同的参数,或者同样的没有参数,Symbol类型也是不同的,因为各自独一无二的存在。
const sym1 = Symbol("sym");
const sym2 = Symbol("sym");
sym1 == sym2;
//result: false
const symNum = Symbol(1);
const symBool = Symbol(true);
sym1;
//result: Symbol(sym)
symNum;
//result: Symbol(1)
symBool;
//result: Symbol(true)
转换
String
const sym = Symbol("symbolVal");
String(sym);
sym.toString();
//result: "Symbol(symbolVal)"
Boolean
const sym = Symbol("symbolVal");
Boolean(sym);
//true
Object
const sym = Symbol("symbolVal");
var obj = Object(sym);
obj
//result: Symbol {Symbol(symbolVal)}
obj.valueOf()
//result: Symbol(symbolVal)
作为对象属性名
可以保证不会出现同名的属性。
var sym = Symbol();
var obj = {
[sym]: "symbol"
};
obj[sym];
//result: "symbol"
obj[sym] = 1;
obj[sym];
//result: 1
Object.defineProperty(obj, sym, {value: 2});
obj[sym];
//result: 2
属性
Symbol.length
长度属性,值为0
Symbol.prototype
描述Symbol构造函数的原型。
方法
Symbol.for([key])
接受一个字符串作为参数,搜索在全局范围中是否存在以该字符串作为描述的Symbol值。返回这个Symbol值。
var sym = Symbol.for("globalSym");
Symbol.for("globalSym");
//result: Symbol(globalSym)
与Symbol()的区别
Symbol()每次运行都是返回一个新值。
Symbol.for()每次运行不一定返回新的值。因为会先行检查给定的key是否已经存在,如果不存在才会新建。
sym == Symbol.for("globalSym");
//result: true
sym0 = Symbol.for("globalSym");
sym === sym0;
//result: true
var sym1 = Symbol("sym");
sym1 == Symbol("sym");
//result: false
Symbol.keyFor(sym)
从全局Symbol注册表中,为给定的Symbol值检索与其关联的键。不过只能搜索全局的Symbol值,也就是使用Symbol.for()创建的Symbol值。
var sym = Symbol.for("globalSym");
var sym2 = Symbol("sym");
Symbol.keyFor(sym);
//result: globalSym
Symbol.keyFor(sym2);
//result: undefined
内置Symbols
JavaScript内建了一些在ES5之前没有暴露给开发者的symbol,他们代表了内部语言行为。
迭代
Symbol.iterator
返回一个对象默认迭代器的方法。
被for...of
使用
Symbol.asyncIterator
返回一个对象默认的异步迭代器的方法。
被for await of
使用。
目前来说还不建议使用在生产环境当中
正则表达式
Symbol.match
用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。
被String.prototype.match()
使用。
Symbol.replace
替换匹配字符串的子串的方法。
被String.prototype.replace()
使用
Symbol.search
返回一个字符串中与正则表达式相匹配的索引的方法。
被String.prototype.search()
使用
Symbol.split
匹配正则表达式的索引处拆分一个字符串的方法。
被String.prototype.split()
使用
其他
Symbol.hasInstance
确定一个构造器对象识别的对象是否为它的实例。
被instanceof
使用
Symbol.isConcatSpreadable
一个布尔值,表明一个对象是否应该展开为它的数组元素
被Array.prototype.concat()
使用
Symbol.toStringTag
用于对象的默认描述的字符串值。
被Object.prototype.toString()
使用。
Symbol.unscopables
拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。
Symbol.species
一个用于创建派生对象的构造器函数。
Symbol.toPrimitive
一个将对象转化为基本数据类型的方法。
Symbol原型
所有Symbol继承自Symbol.prototype。
属性
Symbol.prototype.constructor
返回创建实例原型的函数。
默认为Symbol函数
方法
Symbol.prototype.toSource()
返回包含Symbol对象源码的字符串
覆盖Object.prototype.toSource()
方法
Symbol.prototype.toString()
返回包含Symbol描述符的字符串
覆盖Object.prototype.toString()方法
Symbol.prototype.valueOf()
返回Symbol对象的初始值
覆盖Object.prototype.valueOf()方法
Symbol.prototype[@@toPrimitive]
返回Symbol对象的初始值。
var sym = Symbol("sym");
sym[Symbol.toPrimitive]();
//resullt: Symbol(sym)
注意
- Symbol不能与任何类型进行任何运算
- Symbol不能转换为Number类型
参考网址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
http://caibaojian.com/es6/symbol.html