大家可能知道js中判断对象类型可以用typeof来判断,看下面的情况。
<script> alert(typeof 1);//number alert(typeof "2");//string alert(typeof [1,2,3]);//object alert(typeof {"name":"zhuhui"})//object </script>
从上面中我们可以看出数组和普通对象用typeof判断出来都是object,但是现在我们有这个需求,我们要明确判断出这个对象是具体的哪个对象(比如数组对象,日期对象,正则表达式对象,其他自定义对象,DOM对象等等)那怎么办呢。其实js中有个方法可以准备的判断出。
Object.prototype.toString.call
var type=function(v){ return Object.prototype.toString.call(v); }; alert(type(null));//[object Null] alert(type(undefined));//[object Undefined] alert(type(1));//[object Number] alert(type(true));//[object Boolean] alert(type("2"));//[object String] alert(type([1,2,3]));//[object Array] alert(type({"name":"zhuhui"}));//[object Object] alert(type(type));//[object Function] alert(type(new Date()));//[object Date] alert(type(/^\d+$/));//[object Regexp]
关于这个方法更深入的说明请参考http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html,下面是原作者以前做项目封装判断常见数据类型的js。
/** * type.js 数据类型检测函数 * @author 朱辉 * @email javaee6@qq.com * @version 0.1 */ (function(window, undefined){ xjo = window.xjo || { plugin: {} }; xjo.type = {}; //检测v的类型 辅助函数 var type = function(v){ return Object.prototype.toString.call(v); }; /** * 是否为数组对象类型 如果是就返回true 如果不是就返回false * @namespace xjo.type * @method isArray * @param {Any} v 被检测的变量 * @return {Boolean} 结果 */ xjo.type.isArray = function(v){ return type(v) === '[object Array]'; }; /** * 是否为参数管理器Arguments 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isArguments = function(v){ return v.callee != undefined; }; /** * 是否为迭代序列 包含Array与Arguments 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isIterable = function(v){ return xjo.type.isArray(v) || xjo.type.isArguments(v); }; /** * 是否为空对象 null和undefined和数组的长度为0或空字符串("") 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @param {Boolean} allowBlank [可选] 默认false 空字符串认为是空对象 反之 空字符串不认为是空对象 * @return {Boolean} */ xjo.type.isEmpty = function(v, allowBlank){ return v === null || v === undefined || (xjo.type.isArray(v) && !v.length) || (!allowBlank ? v === '' : false); }; /** * 是否为字符串类型 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isString = function(v){ return typeof v === 'string'; }; /** * 是否为数字类型(为Number且不为正负无穷大数字) 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isNumber = function(v){ return typeof v === 'number' && isFinite(v); }; /** * 是否为布尔值类型 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isBoolean = function(v){ return typeof v === 'boolean'; }; /** * 是否为函数类型 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isFuntion = function(v){ return type(v) === '[object Function]'; }; /** * 是否为对象类型 * @param {Any} v 被检测的变量 * @return {boolean} */ xjo.type.isObject = function(v){ return !!v && type(v) === '[object Object]'; }; /** * 是否为日期类型 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {boolean} */ xjo.type.isDate = function(v){ return type(v) === '[object Date]'; }; /** * 是否为正则表达式类型 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isRegexp = function(v){ return type(v) == '[object RegExp]'; }; /** * 是否为原始数据类型 如果是就返回true 如果不是就返回false * @param {Any} v 被检测的变量 * @return {Boolean} */ xjo.type.isPrimitive = function(v){ return xjo.type.isString(v) || xjo.type.isNumber(v) || xjo.type.isBoolean(v); }; /** * 返回数据类型的字符串形式<br> * 数字类型:"number" <br> * 布尔类型:"boolean" <br> * 字符串类型:"string" <br> * 数组类型:"array"<br> * 日期类型:"date"<br> * 正则表达式类型:"regexp" <br> * 函数类型:"function"<br> * 对象类型:"object"<br> * 参数管理器类型:"arguments"<br> * 其他类型:"unknow" * @param {Any} v 被检测的变量 * @return {String} */ xjo.type.type = function(v){ var result = "unknow"; if (xjo.type.isNumber(v)) { result = "number"; } if (xjo.type.isBoolean(v)) { result = "boolean"; } if (xjo.type.isString(v)) { result = "string"; } if (xjo.type.isArray(v)) { result = "array"; } if (xjo.type.isDate(v)) { result = "date"; } if (xjo.type.isRegexp(v)) { result = "regexp"; } if (xjo.type.isFuntion(v)) { result = "function"; } if (xjo.type.isObject(v)) { result = "object"; } if (xjo.type.isArguments(v)) { result = "argumetns"; } return result; }; xjo.plugin["jo/type"] = true; })(window);
我简单写了一个index.html,内容如下:
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> </head> <body> <script type="text/javascript" src="type.js"></script> </body> </html>
Chrome浏览器打开index.html后,在控制台简单测试如下:
文章来源:http://blog.csdn.net/mashangyou/article/details/24036233?utm_source=tuicool&utm_medium=referral
相关推荐
JavaScript中判断对象类型的常见方法包括`typeof`运算符、`instanceof`运算符以及利用对象的`constructor`属性。每种方法都有其特定的应用场景和限制。 1. `typeof`运算符: `typeof`是一种一元运算符,用于检测...
在JavaScript编程中,判断对象是否为空是一个常见的需求,特别是在处理数据验证、逻辑判断或优化代码性能时。本文将深入探讨三种不同的实现方法,帮助开发者更好地理解和应用这些技巧。 首先,我们要明确什么是“空...
本文将详细介绍JavaScript中Blob对象的具体使用方法,并通过示例代码来展示如何构建和操作Blob对象。 首先,要创建一个Blob对象可以有几种方式。最直接的方式是使用Blob构造函数。构造函数接受两个参数,第一个参数...
以下是一个详细的指南,介绍如何使用JavaScript判断并返回浏览器类型。 首先,JavaScript通过`navigator`对象提供了一系列属性,可以用来获取关于用户浏览器的信息。`navigator.userAgent`属性是最常用的一个,它...
然而,由于JavaScript中对null的特殊处理,需要在判断对象时额外注意。 总结来说,JavaScript提供了多种方法来判断变量的类型,但每种方法都有其适用范围和限制。在实际应用中,需要根据具体的需求和环境来选择最...
然而,`typeof`也有其局限性,例如不能准确判断对象的具体类型,如数组、日期等。此时,我们可以借助其他方法,如`instanceof`或`Object.prototype.toString.call()`,以获取更精确的信息。 总之,`typeof`是...
在JavaScript中,判断两个数组是否相等是一个常见的需求,尤其在处理数据比较或者验证时。根据标题和描述,我们可以区分两种不同的场景: 1. **数组完全相等**:在这种情况下,不仅要求数组中的元素相同,而且元素...
本文将详细介绍如何在JavaScript中编写一个通用的比较函数来判断不同类型的引用对象是否相等,并通过具体的示例代码来解释该函数的工作原理及其应用场景。 #### 比较原理概述 在JavaScript中,当比较两个对象时,...
接下来,我们将通过一个具体的示例代码来进一步理解如何利用`navigator`对象来判断浏览器的类型及版本: ```html <!DOCTYPE html> <title>Browser Detection <script type="text/javascript"> function detect...
在JavaScript中,判断两个数组或对象是否相同是常见的需求。数组和对象作为JS中最基本的数据结构,它们的比较方法各有不同。具体到判断数组或对象的“相同”,通常涉及到是否包含相同的元素或属性以及这些元素或属性...
在提供的`browser.js`文件中,可能包含了更具体的浏览器检测代码或者工具函数,可以结合这个文件进行学习和实践,了解如何在实际项目中运用这些技术来适配不同的浏览器环境。 总结来说,JavaScript通过`navigator....
myObj)`来判断对象是否存在时,如果没有使用`var`声明`myObj`,会抛出`ReferenceError`。原因在于JavaScript解释器在执行前会进行词法分析,将所有`var`声明提升到当前作用域的顶部。因此,即使`if`语句在`var myObj...
`typeof`运算符的局限性在于,它不能区分对象的具体类型,尤其是对于数组、日期(Date)和正则表达式(RegExp)对象,它都返回"object"。因此,`typeof`只适用于区分基本类型和对象类型。 接下来,`instanceof`...
- `typeof`检查:用于检测变量的数据类型,但不能准确判断复杂数据类型如对象。 - `instanceof`操作符:用于检查一个对象是否属于某个构造函数的实例。 - 对象属性检查:通过检查对象是否包含特定的属性或属性值...
`hasOwnProperty()`是JavaScript对象的一个内置方法,它用于判断对象是否具有指定的自有属性,不考虑继承属性。例如: ```javascript var o = {x: 1}; o.hasOwnProperty("x"); // true,自有属性中有x o....
但注意,对于null,它会返回'object',而对于自定义对象或数组,它会返回'object',无法区分具体类型。 - instanceof:这是一个二元运算符,用于检查一个对象是否属于某个类或原型链。例如,`myObj instanceof ...
3. 对于自定义对象或类实例,`typeof`只能告诉你它们是"object",无法区分具体类型。 4. 对于函数,`typeof`能正确识别,但无法区分普通函数和构造函数。 5. 对于ES6的Symbol类型,`typeof`可以识别,但在旧版本...
在JavaScript中,判断一个...总结,JavaScript提供了多种方法来判断对象的类型。根据具体情况,你可以选择适合的方案,确保代码的健壮性和可读性。在处理复杂的类型检测场景时,可能需要结合多种方法以得到准确的结果。