数据类型检测之Object.prototype.toString
- Number/String/Boolean/Symbol/BigInt/Function/Array/RegExp/Date/Object
…的原型链上都有自己的toString方法 - 但是除了Object.prototype.toString()时数据类型检测,其他的都是将其转换为字符串
let arr = []
console.log(arr.toString == Object.prototype.toString);//false
所以我在用Object.prototype.toString时,需要改变其this值
Object.prototype.toString.call()
规则
- 返回值时 ‘[object ?]’
- ?是取决于
- 当对象没有[Symbol.toStringTag] 属性时,或者属性值不是一个字符串,
- 那么就会找对象的类的constructor.name,只对内置类有效
- 手动修改的没有影响constructor
- 如果都没有就时Object
验证
当对象没有[Symbol.toStringTag] 属性时,或者属性值不是一个字符串
let m = new Number(10)
console.log(m[Symbol.toStringTag]);//undefined;
console.log(m.constructor.name);//'Number'
Object.prototype.toString.call(m);// '[object Number]'
---------------m[Symbol.toStringTag]添加值------------------
m[Symbol.toStringTag] = '500'
Object.prototype.toString.call(m);// '[object 500]'
那么就会找对象的类的constructor.name,只对内置类有效
function yy(){
}
//因为yy不是内置类
let son = new yy();
console.log(son.constructor.name);//'yy'
Object.prototype.toString.call(m);//'[object Object]' 因为yy不是内置类
手动修改的没有影响constructor
let m = new Number(20);
m.constructor = function io(){
}
console.log(m[Symbol.toStringTag]);//undefined
console.log(m.constructor.name);//'io'
console.log(Object.prototype.toString.call(m));//'[object Number]'