美文网首页
Object.prototype.toString.call(o

Object.prototype.toString.call(o

作者: Mica_马超 | 来源:发表于2021-09-29 10:36 被阅读0次

    看下测试结果:

    console.log(Object.prototype.toString.call('Mica')); // [object String]
    console.log(Object.prototype.toString.call(12)); // [object Number]
    console.log(Object.prototype.toString.call(true)); // [object Boolean]
    console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
    console.log(Object.prototype.toString.call(null)); // [object Null]
    console.log(Object.prototype.toString.call({ name: 'Mica' })); // [object Object]
    console.log(Object.prototype.toString.call(function(){})); // [object Function]
    console.log(Object.prototype.toString.call([])); // [object Array]
    console.log(Object.prototype.toString.call(new Date)); // [object Date]
    console.log(Object.prototype.toString.call(/\d/)); // [object RegExp]
    
    function Person(){};
    console.log(Object.prototype.toString.call(new Person)); // [object Object]
    

    首先我们先Object.prototype.toString.call(obj)理解这句话的意思:

    调用Object.prototype.toString方法,使用call改变this指向obj

    疑问1:本身也有toString()方法,那我们为什么非要用Object上的呢?

    让我们来看一下各自的toString()方法:

    var num = 123
    num.toString() // '123'
    
    var str = 'hello'
    str.toString() // 'hello'
    
    var bool = false
    bool.toString() // 'false'
    
    var arr = [1, 2, 3]
    arr.toString()  // '1,2,3'
    
    var obj = { lang:'zh' }
    obj.toString()  // '[object Object]'
    
    var fn = function(){}
    fn.toString()  // 'function(){}'
    
    null.toString()  // Cannot read property 'toString' of null
    
    undefined.toString() // Cannot read property 'toString' of undefined
    

    toString由名字可以看出此方法是将传入的数据类型转换成字符串输出(null和undefined除外)

    在JavaScript中,所有类都继承于Object,因此toString()方法应该也被继承了,但由上述可见事实并不像我们想的那样,其实各数据类型使用toString()后的结果表现不一的原因在于:所有类在继承Object的时候,创建了自己的toString()方法。

    Object.prototype.toString === Array.prototype.toString // false
    Object.prototype.toString === Number.prototype.toString // false
    Object.prototype.toString === String.prototype.toString // false
    
    // 定义一个数组
    var arr = [1, 2, 3]
    // 数组原型上是否具有 toString() 方法
    console.log(Array.prototype.hasOwnProperty('toString')) // true
    
    // 数组直接使用自身的 toString() 方法
    console.log(arr.toString()) // '1,2,3'
    
    // delete操作符删除数组原型上的 toString()
    delete Array.prototype.toString
    
    // 删除后,数组原型上是否还具有 toString() 方法
    console.log(Array.prototype.hasOwnProperty('toString')) // false
    
    // 删除后的数组再次使用 toString() 时,会向上层访问这个方法,即 Object 的 toString()
    console.log(arr.toString()) // '[object Array]'
    

    疑问2:为什么Array.prototype.toString.call({})返回'[object Object]',执行结果和Object.prototype.toString.call(obj)一样

    我们刚刚也说过了各个类都创建了自己的toString方法,为什么Array.prototype.toString.call({})返回的是'[object Object]'

    扩展:Object.toStringObject.prototype.toString

    其实每个类上还存在一个toString方法,这个方法是继承与Function.prototype.toString

    Array.toString === Function.prototype.toString // true
    Array.toString === Object.toString // true
    Array.toString === String.toString // true
    

    https://blog.csdn.net/qq_38722097/article/details/88046377
    https://juejin.cn/post/7007416743215759373
    https://zhuanlan.zhihu.com/p/118793721

    相关文章

      网友评论

          本文标题:Object.prototype.toString.call(o

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