ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,它是JavaScript的第七种数据类型
var s = Symbol();
typeof s
//'symbol'
var sy=Symbol('foo')
\\Symbol(foo)
Symbol函数前不能使用 new;生成Symbol是一个原始类型的值,Symbol值不是对象,所以不能添加基本属性,它类似于字符串的数据类型
Symbol 接受字符串,方便对实例的描述
如果参数为对象就会被 toString 转换为字符串后调用
var sd={}
var sg=Symbol(sd)
//Symbol([object Object])
Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的
var sy1=Symbol();
var sy2=Symbol();
sy1==sy2
//false
sy1===sy2
//false
Symbol值不能与其他类型的值进行运算,会报错。
var sy1=Symbol();
var str='sada'+sy1
\\TypeError: Cannot convert a Symbol value to a string
消除魔术字符串
魔术字符串:在代码之中多次出现,与代码形成强耦合的某一个具体的字符串或者数值
Symbol作为属性名不会出现for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回
Object.getOwnPropertySymbols可以返回Symbol作为对象属性
Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名
Symbol.for()
var sy1=Symbol.for('sy')
var sy2=Symbol.for('sy')var
sy1===sy2
//true
var sm1=Symbol('ha')
var sm2=Symbol.for('ha')
sm1===sm2
//false
Symbol.keyFor()
Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key
var sm1=Symbol('ha')
var sm2=Symbol.for('ha')
var key1=Symbol.keyFor(sm1)
//undefined
var key2=Symbol.keyFor(sm2)
//ha
需要注意的是,Symbol.for为Symbol值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值
内置的Symbol值
Symbol.hasInstance
指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
}
[1, 2, 3] instanceof new MyClass() // true
Symbol.hasInstance
先这样后面补充(有点懵)