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]
所以,使用时一定要小心,千万不要修改内建对象。
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1173