Symbol

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

先这样后面补充(有点懵)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值