您的位置:首页 > 移动开发 > Objective-C

js中通过Object.prototype.toString方法----精确判断对象的类型

2016-11-04 11:32 826 查看
在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object”
五种。

对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

要想区别对象、数组、函数单纯使用 typeof 是不行的,JavaScript中,通过Object.prototype.toString方法,判断某个对象值属于哪种内置类型。

例子:

var arr = [];

console.log(Object.prototype.toString.call(arr)) 

结果:

 "[object Array]"

在ES3中,Object.prototype.toString方法的规范如下:

 

15.2.4.2 Object.prototype.toString() 

在toString方法被调用时,会执行下面的操作步骤:

 

1. 获取this对象的[[Class]]属性的值。

 

2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串。

 

3. 返回第二步的操作结果Result(2)。

[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的:

内部属性 描述

[[Class]] 一个字符串值,表明了该对象的类型。

其过程简单说来就是:1、获取对象的类名(对象类型)。2、然后将[object、获取的类名、]组合并返回。

由于 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]

判断是否为函数

function isFunction(it) {

        return Object.prototype.toString.call(it) === '[object Function]';

    }

判断是否为数组:

function isArray(o) { 

  return Object.prototype.toString.call(o) === '[object Array]';  

}

typeof是用来检测基本类型的最佳工具。

检测引用类型可以使用 instanceof,它返回布尔值。

而Object.prototype.toString.call对于检测基本类型和引用类型是通吃的。

if (!Array.isArray) {

/**
* 判断一个对象是否是数组。
* @param {Object} obj 要判断的对象。
* @returns {Boolean} 如果 @obj 是数组则返回 @true,否则返回 @false。
* @example
* Array.isArray([]); // true
*
* Array.isArray(document.getElementsByTagName("div")); // false
*
* Array.isArray(new Array); // true
* @since ES5
*/
Array.isArray = function (obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
};

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: