Symbol - 看似平凡的Symbol其实我们每天都在用 - 对象操作

前言

小伙伴们大家好。今天继续分享Symbol相关的小知识。相信小伙伴们对instanceof,Object.prototype.toString,Number({}),String({})这些都不陌生吧,但小伙伴是否知道当我们使用这些东西时,其实多多少少都会跟Symbol有些许的关系。下面我们就来看一下到底有什么关系呢。

其实在日常开发中,除了能够定义自己使用的Symbol值以外,ES6还为我们提供了一些内置的Symbol属性值,指向语言内部使用的一些方法。

Symbol.hasInstance

对象的Symbol.hasInstance属性指向一个内部的方法,当我们使用instanceof去检测一个对象是否是一个类的实例时,就会调用这个方法。比如:arr instanceof Array,在底层实际调用的是Array[Symbol.hasInstance] (arr)这个方法,注意这个方法的返回值只能是布尔类型。

const Even = {
  [Symbol.hasInstance](obj) {
  	console.log('instanceof 时我会被调用哦')
    return Number(obj) % 2 === 0;
  }
};
1 instanceof Even // false
2 instanceof Even // true
12345 instanceof Even // false

Symbol.toPrimitive

对象的Symbol.toPrimitive属性指向一个内部的方法。当一个对象被转换为原始类型的值时,会调用这个方法并返回该对象被转换为原始类型后的值。
Symbol.toPrimitive被调用时接收一个字符串参数,并且该字符串只能是三个值中的一个:

  • ‘number’:把对象转换为数字时,参数值为’number’
  • ‘string’:把对象转换为字符串,参数值为’string’
  • ‘default’:默认值
let obj = {
  [Symbol.toPrimitive](hint) {
    switch (hint) {
      case 'number':
        return 1;
      case 'string':
        return 'obj';
      case 'default':
        return 'default';
   }
}
Number(obj) // 1
String(obj) // 'obj'
obj == 1 // 'default'

Symbol.toStringTag

对象的Symbol.toStringTag属性指向一个内部的方法。当我们通过调用object.prototype.toString方法去检测对象的具体数据类型时,会把Symbol.toStringTag属性的值返回,并出现在toString方法返回的字符串之中,表示对象的具体类型。比如如果检测一个对象的类型是[object Array],那么Symbol.toStringTag属性的值就是Array

let obj = {
	[Symbol.toStringTag]: "HelloWorld"
}
class Yannis{
	static [Symbol.toStringTag] = "Javascript"
}
Object.prototype.toString.call(obj);// [object HelloWorld]
Object.prototype.toString.call(Yannis);// [object Javascript]

总结

通过本章的学习我们又了解到:原来我经常用的实例检测,对象类型检测和对象类型转换还跟Symbol相关呢。关于Symbol的三个内置属性是就分享到这里了。

喜欢的小伙伴欢迎点赞留言加关注哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值