数据类型检测之Object.prototype.toString

数据类型检测之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]'

猜你喜欢

转载自blog.csdn.net/webMinStudent/article/details/109160550
今日推荐