`

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

阅读更多
转自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是否是字符串。

分享到:
评论

相关推荐

    JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Object.prototype.toString.call(arr)) //[object Array] 本文要讲的就是,...

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

    这是一个十分常见的问题,用 typeof 是否能准确判断一个对象变量,答案是否定的,null 的结果...(无法区分自定义对象类型,自定义类型可以采用instanceof区分) console.log(Object.prototype.toString.call("jerry

    JavaScript中使用Object.prototype.toString判断是否为数组

    为什么要用Object.prototype.toString而不是Function.prototype.toString或者其它?这是和他们的toString解释方式有关系的。下面是ECMA中对Object.prototype.toString的解释: 代码如下: Object.prototype.toString...

    js代码-Object.prototype.toString

    例如,`typeof null`会返回`"object"`,而`Object.prototype.toString.call(null)`则返回`"[object Null]"`,这就能更精确地区分null和其他对象。 `toString`方法在实际编程中有很多应用场景。比如,你可以自定义...

    判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    `Object.prototype.toString.call()`实际上是利用了JavaScript原型链的特性,将目标对象的`toString`方法应用于`Object.prototype`,从而得到表示其类型信息的字符串。例如: ```javascript var jsonStr = '{"key":...

    【JavaScript源代码】JavaScript类型检测的方法实例教程.docx

    总结来说,JavaScript中的类型检测涉及多种方法,包括`typeof`、`instanceof`、`Object.prototype.toString.call()`、`Array.isArray()`和自定义函数。根据实际需求选择合适的方法,可以确保代码的准确性和健壮性。...

    JavaScript中的Object对象学习教程_.docx

    例如,`Object.prototype.toString.call(value)`可以返回`[object Type]`的形式,其中`Type`是值的类型。这使得我们能够编写出比`typeof`更精确的类型检测函数: ```javascript var type = function (o) { var s =...

    js中toString方法3个作用.docx

    在上面的例子中,我们使用 Object.prototype.toString.call(arr) 来检测数组的类型。该方法返回 `[object Array]`,表明该对象是一个数组。 返回该数字对应进制的字符串 toString 方法的第三个作用是返回该数字...

    JS开发常用工具函数小结.docx

    这有助于区分null和其他对象类型。 5. `getRawType` 函数返回一个值的原始类型,如Number、String、Object等。它利用`Object.prototype.toString.call()`方法获取类型字符串并进行截取。 6. `isPlainObject` 函数...

    前端开源库-es-tostring

    而`object.prototype.toString.call(obj)`这个表达式则允许我们动态地调用目标对象的`toString`方法,无论它属于哪种类型,从而获取其内部表示。 `es-tostring`库的目标是提供一个简洁的API,让开发者可以快速地对...

    js中检测数据类型的方法总结1

    这个方法首先处理 `null` 的特殊情况,然后使用 `Object.prototype.toString.call()` 获取类型字符串并修剪两端的 `[object` 和 `]`,最后将结果转换为小写。这样,我们就可以对任何值进行类型检查,如 `typeOf([]) ...

    03-类型判断.md

    例如,`Object.prototype.toString.call([1,2])`将返回`"[object Array]"`。需要注意的是,在使用`toString`方法时,必须显式地通过`Object.prototype.toString`调用,而不是使用对象实例的`toString`方法,因为后者...

    前端面试资料,适合中高级前端面试者

    Object.prototype.toString.call({}) // '[object Object]' Object.prototype.toString.call([]) // '[object Array]' Object.prototype.toString.call(null) // '[object Null]' ``` #### 三、类型转换 ...

    详解js类型判断

    js类型转换中typeof会将null也识别为object, 而且返回的类型比少,我们用Object.prototype.toString来实现 第一版 function isArray(value){ return Object.prototype.toString.call(value) === "[object Array]"; ...

    javascript中怎么做对象的类型判断

    本文将详细介绍几种常见的JavaScript对象类型判断方法,包括typeof、constructor和Object.prototype.toString.call(),并结合实际案例进行解释。 1. typeof 方法 typeof是JavaScript中最基础、最常用的一种类型判断...

    前端Javascript相关面试基础问答整理md

    **2.3 使用 `Object.prototype.toString.call()`** - 该方法可以准确地检测出数据的类型,包括 `null` 和 `undefined`。 - 示例代码: ```javascript Object.prototype.toString.call(''); // "[object String]" ...

Global site tag (gtag.js) - Google Analytics