Symbol.toStringTag属性

如果判断一个变量是否为数组,有很多种方式,当然可以使用如下的这种方式:

Object.prototype.toString.call(props) === '[object Array]'

在es6中,引入了Symbol,它有一个toStringTag属性,通过这个属性可以改变Object.prototype.toString()返回的标识。

MDN上解释为:

Symbol.toStringTag 是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里。

怎么个意思呢?就是说这个Symbol所代表的属性在每一个对象中都存在,其定义了调用对象的Object.prototype.toString.call()方法时返回的值。以数组为例,它返回的值通常是Array,那么这个Array正是存储在Symbol.toStringTag中。

我们也可以为自己定义的对象定义Symbol.toStringTag属性。

function Teacher(name) {
  this.name = name
}

Teacher.prototype[Symbol.toStringTag] = 'Teacher'

方法调用:

const teacher = new Teacher('Jason')
console.log(teacher.toString()) //[object Teacher]
console.log(Object.prototype.toString.call(teacher)) //[object Teacher]

这个影响了对象自身的toString方法,当然可以通过重写来覆盖。

Teacher.prototype.toString = function() {
  return this.name
}

console.log(teacher.toString()) //Jason

这个属性也有一定的破坏性,它并不阻止你为哪些对象设置该属性,那么如果我为Array对象设置该属性,那么就修改了原来的返回结果。

Array.prototype[Symbol.toStringTag] = 'Hello'
console.log(Object.prototype.toString.call([])) //[object Hello]

所以,使用时一定要小心,千万不要修改内建对象。

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注