美文网首页js原型链的深入理解JS内容
深入理解Object.prototype.toString.ca

深入理解Object.prototype.toString.ca

作者: 趁你还年轻233 | 来源:发表于2018-05-23 01:30 被阅读844次

    为什么Object.toString.call([1,2,3])返回[object Array]?可以直接[].toString()返回[object Array]吗?
    难道真的像自己理解的那样,是通过call将[1,2,3]作为Object.toString的实参传递了进去吗?不是。
    直接Object.toString([1,2,3])不能实现同样的功能吗?不能。
    而实际上也有Array.__proto__.toString()这种形式,所以是可以直接调用arr.toString()的,这样能检测出吗?不行。

    那到底是什么原因?
    先来肝一个表格。


    数据类型 例子 return
    字符串 "foo".toString() "foo"
    数字 1.toString() Uncaught SyntaxError: Invalid or unexpected token
    布尔值 false.toString() "false"
    undefined undefined.toString() Uncaught TypeError: Cannot read property 'toString' of undefined
    null null.toString() Uncaught TypeError: Cannot read property 'toString' of null
    String String.toString() "function String() { [native code] }"
    Number Number.toString() "function Number() { [native code] }"
    Boolean Boolean.toString() "function Boolean() { [native code] }"
    Array Array.toString() "function Array() { [native code] }"
    Function Function.toString() "function Function() { [native code] }"
    Date Date.toString() "function Date() { [native code] }"
    RegExp RegExp.toString() "function RegExp() { [native code] }"
    Error Error.toString() "function Error() { [native code] }"
    Promise Promise.toString() "function Promise() { [native code] }"
    Obejct Object.toString() "function Object() { [native code] }"
    Math Math.toString() "[object Math]"

    为什么会出现下面的情况?

    Object.toString.call(Array)//"function Array() { [native code] }"
    Object.prototype.toString.call(Array)//"[object Function]"
    

    答案在这里!

    Object.toString()//"function Object() { [native code] }"
    Object.prototype.toString()//"[object Object]"
    

    Object对象和它的原型链上各自有一个toString()方法,第一个返回的是一个函数,第二个返回的是值类型。

    既然知道了不同,现在我们再来分析下Object.prototype.toString.call(Array)//"[object Function]"
    Array对象本身返回一个构造函数,Array//ƒ Array() { [native code] },而Object.prototype.toString()返回的是//"[object Type]"的形式,通过call将Array的this上下文切换到Object,从而调用了Object.prototype.toString(),因此返回[object Function]

    需要注意的是:Math.toString()直接返回"[object Math]"。

    实际开发中,我们用到最多的可能是:Object.prototype.toString.call([1,2,3])//"[object Array]"这种。

    总结:

    • 一般情况下,js中对象的toString(),返回字符串,内容与函数声明语法有关,例如[1,2,3].toString()//"1,2,3"
    • 大多数都返回函数的完整源码,Array.toString()//"function Array() { [native code] }"
    • 内置函数往往返回一个类似"[native code]"的函数体,需要配合call方法,比如Object.prototype.toString.call([1,2,3])//"[object Array]"

    那么不可以直接Array.prototype.toString.call([1,3,4])吗?
    不行!
    因为Array,Function,Date虽然是基于Object进行创建的,但是他们继承的是Object.toString(),而不是Object.prototype.toString()。
    再加深一遍印象:

    Object.toString()//"function Object() { [native code] }"
    Object.prototype.toString()//"[object Object]"
    

    所以这就是必须用Object.prototype.toString()去检测类型的原因。

    至于Object.prototype.toString()内部是怎么实现的,等到时机成熟再去深入。

    相关文章

      网友评论

        本文标题:深入理解Object.prototype.toString.ca

        本文链接:https://www.haomeiwen.com/subject/fcsljftx.html