• Object.prototype.toString.call(arg)详解


    经常能碰到Object.prototype.toString.call对参数类型进行判断,一开始只知道怎么使用,却不了解具体实现的原理,最近恶补了一下相关知识,写个笔记加强理解,有什么不对的请指教。
    首先看一下针对不同类型的参数得到的结果,加上浏览器都兼容,所以,这也成为经常用于参数类型判断的做法

    Object.prototype.toString.call([])  //"[object Array]"
    Object.prototype.toString.call({}) //"[object Object]"
    Object.prototype.toString.call("") //"[object String]"
    Object.prototype.toString.call(null) //"[object Null]"
    Object.prototype.toString.call(undefined) //"[object Undefined]"
    Object.prototype.toString.call(0) //"[object Number]"
    Object.prototype.toString.call(true) //"[object Boolean]"
    

    这里主要两个难点,Object.prototype.toString()和call()
    关于toString(), 可以查看一下es5文档规范对Object.prototype.toString()的定义,可查看es5文档

    简单来说就是Object.prototype.toString()会返回[object, [[class]]]的字符串,其中,[[class]]是es定义的类型,包含"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", 和 "String";再加上es5新增加的返回[object Undefined]和[object Null]
    至于Object.prototype.toString.call(arg)则表示给予arg赋予并执行Object的toString方法,由于Object.prototype.toString()本身允许被修改的,就类似Array、Boolean、Number中的toString()就重写过,因此需要直接调用Object.prototype.toString.call(arg)来判断arg的类型

    var arr = [1,2,3];
    var obj = {a:'a'};
    var num = 3;
    var str = 'string';
    var bool = true;
    
    arr.toString(); // "1,2,3"
    obj.toString(); // "[object Object]" 未修改的Object.prototype.toString(),才可以用于类型判断
    num.toString(); // "3"
    str.toString(); // "string"
    bool.toString(); // "true"
    

    关于call(),格式为Function.prototype.call(thisArg [,arg1 [,arg2, … ]])
    call方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj指定的新对象。第一句是指借用别人的函数,第二句是指借用别人的上下文环境。

    function A(){
        this.name = "a";
    }
    function B(){
        this.name = "b";
    }
    A.prototype.showName = function(){
        console.log('this is function a and showName value: '+this.name);
    }
    A.prototype.showName.call(B); // this is function a and showName value: B
    //B 执行了A中的showName
    

    Object.prototype.toString.call(arg)就很容易理解了,arg执行了Object的toString方法,这样也就很容易理清不同参数的返回结果了。

  • 相关阅读:
    Android检验下载的文件的完整性
    RecyclerView与SwipeRefreshLayout等组合使用后宽度不能填满
    android断点续传实现方案之三
    博客美化,页首波浪
    博客美化,页首的飘雪效果
    博客美化,博客背景图片设置
    博客美化,页脚游动的鱼
    博客美化,左侧下面的卡通小姐姐
    博客美化,右下角的卡通小姐姐
    .Net工厂方法模式(Factory Method Pattern)
  • 原文地址:https://www.cnblogs.com/yanyuji/p/6873811.html
Copyright © 2020-2023  润新知