当前位置:首页 > 开发 > Web前端 > 前端 > 正文

[转] Object.prototype.toString.call() 区分对象类型

发表于: 2014-06-30   作者:alleni123   来源:转载   浏览次数:
摘要: 转自 http://www.veryhuo.com/a/view/52778.html 在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。
转自 http://www.veryhuo.com/a/view/52778.html


在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

要想区别对象、数组、函数单纯使用 typeof 是不行的。或者你会想到 instanceof 方法,例如下面这样:

var a = {};
var b = [];
var c = function () {};

//a b c 都是 Object 的实例
console.log(a instanceof Object) //true
console.log(b instanceof Object) //true
console.log(c instanceof Object) //true

//只有 Array 类型的 b 才是 Array 的实例
console.log(a instanceof Array) //false
console.log(b instanceof Array) //true
console.log(c instanceof Array) //false

//只有 Function 类型的 c 才是 Function 的实例
console.log(a instanceof Function) //false
console.log(b instanceof Function) //false
console.log(c instanceof Function) //true
从以上代码来看,要判断复合数据类型,可以如下判断:

//对象
(a instanceof Object) && !(a instanceof Function) && !(a instanceof Function)
//数组
(a instanceof Object) && (a instanceof Array)
//函数
(a instanceof Object) && (a instanceof Function)
更简便的方式,即是使用 Object.prototype.toString.call() 来确定类型,ECMA 5.1 中关于该方法的描述[1]是这样的:

When the toString method is called, the following steps are taken:
If the this value is undefined, return “[object Undefined]“.
If the this value is null, return “[object Null]“.
Let O be the result of calling ToObject passing the this value as the argument.
Let class be the value of the [[Class]] internal property of O.
Return the String value that is the result of concatenating the three Strings “[object ", class, and "]“.
由于 JavaScript 中一切都是对象,任何都不例外,对所有值类型应用 Object.prototype.toString.call() 方法结果如下:

console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call('123')) //[object String]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(true)) //[object Boolean]
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
console.log(Object.prototype.toString.call(function(){})) //[object Function]
所有类型都会得到不同的字符串,几乎完美。




=============================================================

百度登陆的all.js中有这么一段代码:
baidu.phoenix.lang.isString = function (a) {
    return '[object String]' == Object.prototype.toString.call(a)
};

这里就是用来验证参数a是否是字符串。

[转] Object.prototype.toString.call() 区分对象类型

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
引言: 最近比较搓,忙得没空写写博客,回想一下又好像没忙什么事。得反省一下了,当然此是后话。
IntelliSense:无法重载仅按返回类型区分的函数 d:\programfiles (x86)\microsoft sdks\windows\v7.0
  在开始正文之前,我先来区分一下标题的这两个词的含义。所谓类型对象,就是指运行时为加载到应
Python 类型和对象 原址:http://wiki.woodpecker.org.cn/moin/PyTypesAndObjects#A.2Bj9lOm2cJTsBO
原文地址:http://blog.csdn.net/aimingoo/article/details/6676530 这个图来自于《JavaScript语言
转: http://blog.joycode.com/sumtec/archive/2004/11/18/39144.aspx 今天看到朋友 wayfarer写的 一
转自http://www.cnblogs.com/bookideas/ " 我们知道,在收集一个软件系统需求的时候,一般会用到用
今天在把一个Array对象系列化成json对象时,最终的结果老是不对,跟下去,发现jsonhelper( 转化js
OE中的对象关系一共分四种,one2one,one2many,many2one,many2many.他们的意思分别是一对一,一对多
基础知识: 在 Java 在, java.lang.String 它可以用来表示长串(超过长度 255), 字节数组 byte[] 可
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号