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 //falseSymbol值不能与其他类型的值进行运算,会报错。
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 //falseSymbol.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 中取到同一个值
指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
class MyClass { [Symbol.hasInstance](foo) { return foo instanceof Array; } } [1, 2, 3] instanceof new MyClass() // true先这样后面补充(有点懵)
