经常能碰到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方法,这样也就很容易理清不同参数的返回结果了。

Object.prototype.toString.call(arg)详解的更多相关文章

  1. Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()判断数组的方法的优缺点

    1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...

  2. 前端面试题1:Object.prototype.toString.call() 、instanceof 以及 Array.isArray()三种方法判别数组的优劣和区别

    1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...

  3. JavaScript类型判断详解(Object.prototype.toString.call()方法进行数据类型的可靠判断)

    前言 在编写一些类库中,我们经常需要判断一些未知的用户的输入和配置,故而需要进行一系列的类型判断.故而总结下JS是如何进行类型判断的 typeof typeof操作符返回一个字符串,表示未经计算的操作 ...

  4. 为什么用Object.prototype.toString.call(obj)检测对象类型?

    最近做了做一些js面试25 Essential JavaScript Interview Questions*,其中第一道是:使用typeof bar === "object"检测 ...

  5. 图形验证码知识点整理 Object.prototype.toString.call()等

    使用typeof bar === "object"检测”bar”是否为对象有什么缺点?如何避免?这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的, ...

  6. 关于toString()和valueOf()以及Object.prototype.toString.call()的结合理解

    一.先说说String(): String()是全局函数,把对象的值转换为字符串. 语法:String(obj); 任何值(对象)都有String()方法,执行过程是这样的:首先,如果该对象上有toS ...

  7. 用Object.prototype.toString.call(obj)检测对象类型原因分析

    用Object.prototype.toString.call(obj)检测对象类型原因分析  更新时间:2018年10月11日 08:46:33   投稿:laozhang    我要评论   在本 ...

  8. 利用Object.prototype.toString方法,实现比typeof更准确的type校验

    Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型. 调用方法: Object.prototype.toString.call(value) 不同 ...

  9. instanceof, typeof, & Object.prototype.toString

    /** * * @authors Your Name (you@example.org) * @date 2016-11-18 09:31:23 * @version $Id$ */instanceo ...

随机推荐

  1. 第十二、模块二、调用中国天气网和qqOnline及TrainTimeWebService接口来突出Json方法

    一. 浏览网页的时候,发送的请求.服务器反回来的永远是字符串,由于服务器后台使用的语言不通,所以就需要用工具反解,这里用到了json json方法一 json.loads()将字符串转化为python ...

  2. 剑指offer之 数值的整数次方

    问题描述:实现函数double power(double base,int exponent),求base的exponent次方.不能使用库函数,同时不需要考虑大数问题. package Proble ...

  3. php获取图片的拍摄及其他数据信息

    服务器配置说明:1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前 ...

  4. linux挂载/卸载优盘

    linux载入优盘 查看优盘 ls /dev/ sdb1 挂载到/mnt/usb目录 mount /dev/sdb1 /mnt/usb ntfs优盘需要安装ntfs-3g mount -t ntfs- ...

  5. springmvc接受表单多条数据的值

    点击下面链接查看具体内容: http://blog.csdn.net/lutinghuan/article/details/46820023

  6. jsp的9个内置对象

    Jsp提供了request.response.session.application.out.page.config.exception.pageContext9个内置对象. 1. Request R ...

  7. cf 429B Working out(简单dp)

    B. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. Spring4自动装配(default-autowire) (转)

    原文地址:http://blog.csdn.net/conglinyu/article/details/63684957 Spring 自动装配 通过配置default-autowire 属性,Spr ...

  9. Arc077_E Guruguru

    传送门 题目大意 有$m$个点编号从小到大按照顺时针编成了一个环,有一枚棋子,每次移动可以选择顺时针移动到下一个或者直接移动到编号为$x$的点,现在有$n-1$次数操作,第$i$次要把棋子从第$A_i ...

  10. codeforces914G Sum the Fibonacci

    题目大意:给定一个长为$n$($n\leq 10^6$)的序列S,定义一个合法的五元组$(a,b,c,d,e)$合法当且仅当 $$ ( S_a \mid S_b ) and S_c and ( S_d ...