进阶/ toString()大刀阔斧

故事的开始。。。

  源于2019年的一次邂逅   猛戳这里

obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

这是因为toString为Object的原型方法,
而Array 、Function等类型作为Object的实例,都重写了toString方法。
不同的对象类型调用toString方法时,
根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),
而不会去调用Object上原型toString方法(返回对象的具体类型),
所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。

var str = 'this is string';
str.toString()

运行结果

"this is string"
//转成字符串

继续探索

var str = 'this is string';
toString(str)
// "[object Undefined]"

总结:object.toString()只是输出该对象的信息,并以字符表示

但是js提供的内置函数toString()输出的结果为"[object Window]",这和str对象没人任何联系,接下来我只对toString()方法详解。

2.toString()详解

//这段文字意义不明
当调用toString方法时,下列步骤会被执行:

    如果this未定义时,返回“[object Undefined]”

         如果this为null时,返回“[object Null]”

    定义O,并且让O=ToObject(this)

    定义class,并且使class为O内置属性[[class]]的值

    返回三个字符串的拼接字符:"[object",class,"]"
————————————————

官方解释,可以清晰的得出toString()是在以特殊的字符串形式输出this的类型,不管你传入什么参数,该方法都是执行了window.toString()方法,this一直指向了window对象,所以输出了上述结果。//待验证

3.怎么使用toString()方法判断任意类型

toString()始终判断的是this的类型,那么只要将this指向其他对象,就能判断该对象的类型。

到了这步就比较清楚了,js中改变this有那种方式,一种是call方法,另一种是apply方法,我们可以通过实验看看有没有达到我们想要的结果。

var str = 'this is string';
toString.call(str)
//"[object String]"

!!!成功

4.注意的地方

在IE中使用toString.call()方法时会报错,建议使用Object.prototype.toString.call()(所有浏览器都支持),这是js为原始对象原型提供的toString方法,用法和toString方法一样。

posted @ 2020-05-08 10:15  容忍君  阅读(304)  评论(0编辑  收藏  举报