文档章节

javascript对象类型判断

big军
 big军
发布于 2013/12/20 11:03
字数 1314
阅读 2638
收藏 11

#####1.使用typeof操作符

typeof操作符号的作用是返回一个用于只是其操作对象类型的字符串。语法如下:

typeof val

val参数作为一个表达式,代表了javascript中的对象类型或基本数据类型,typeof运算会返回该对象或基本数据类型的字符串描述。

typeof根据操作对象和对应的类型描述字符串,包括以下几种:

<table class="standard-table"> <thead> <tr> <th scope="col">操作对象或基本数据类型</th> <th scope="col">类型描述字符串</th> </tr> </thead> <tbody> <tr> <td>Undefined</td> <td><code>"undefined"</code></td> </tr> <tr> <td>Null</td> <td><code>"object"</code></td> </tr> <tr> <td>Boolean</td> <td><code>"boolean"</code></td> </tr> <tr> <td>Number</td> <td><code>"number"</code></td> </tr> <tr> <td>String</td> <td><code>"string"</code></td> </tr> <tr> <td>Function</td> <td><code>"function"</code></td> </tr> <tr> <td>Object(任何其它js对象)</td> <td><code>"object"</code></td> </tr> </tbody> </table>

例如:

// string
typeof "" === "string";
typeof "abc" === "string" ;
typeof String("abc") === "string" ;
typeof (typeof 1) === "string" ;

// number
typeof 1 === "number" ;
typeof NaN === "number" ;
typeof Math.PI === "number" ;
typeof Infinity === "number" ;
typeof Number(1) === "number";

// boolean
typeof true === "boolean" ;
typeof false === "boolean" ;
typeof Boolean(false) === "boolean";

// undefined
typeof Undefined === "undefined" ;
typeof val === "undefined"; // 在js中通过var定义但未初始化的变量值为undefined,任何未通过var定义且未初始化的变量的初值为undefined

// function
typeof function(){} === "function" ; 
typeof String === "function" ;
typeof Object === "function" ;
typeof new Function() === "function" ;

// object
typeof {} === "object" ;
typeof [] === "object" ;
typeof new Date() === "object" ;
typeof new String("abc") === "object" ; // ---1
typeof new Number("abc") === "object" ; // ---2
typeof new Boolean("abc") === "object" ;// ---3
typeof null === "object"	// ---4

以上示例中,在判断对象类型时1,2,3,4四种情况比较特殊,其中1,2,3属于一类,javascript中通过new操作符来创建对象,new后面跟的是构造器(constructor),javascript中没有类似于java中的自动装箱/拆箱(Auto-Boxing/Unboxing)机制来完成基本数据类型与其对应对象类型的自动转换,语言的灵活性与语法的规范性不能兼得,所以在实际编程中只能靠约定尽量避免这种会产生歧义的使用方式。

null值在逻辑上表示空对象指针,这也可以理解typeof返回的返回值为什么是"object"了。所以非空对象类型的正确的判断方式是

typeof val === "object" && val !== null

此外以上判断对象类型的示例中忽略了javascript中的正则表达式。由于浏览器之间的差异,对于正则表达式的判断没有一致性的实现,对于正则表达式而言,typeof可能会返回"object""function"

typeof /w/ === 'function' ;
typeof /w/ === 'object'

#####2.使用toString方法

javascript语言环境中提供了一些标准的内建对象类型,其中Object类型是所有对象类型的基类,javascript中没有纯粹化的类型的概念,而是基于javascript中特有的继承模式:原型链继承,所有内建类型对象或自定义类型对象在创建后都会继承Object.prototype中的属性和方法,在Object的原型对象中的toString()方法会返回一个代表对象类型的字符串,该字符串的格式为"[object type]",其中type则代表对象的类型。如:

var obj = new Object();
obj.toString(); // return [object Object]

因此只要自定义类型没有重写其原型对象中的toString()方法,或着派生自Object的对象没有重写toString()方法,那么调用对象本身的toString()方法可以正确获得其类型描述。如对于内建类型:

// date
new Date().toString(); // return [object Date]

// number
var val = 1 ;
new Number(1).toString();	// return [object Number]
val.toString(); // return [object Number]

// boolean
new Boolean(true).toString(); // return [object Boolean]
var val = true ;
val.toString(); // return [object Boolean]

// string
new String("").toString();// return [object String]
var val = “” ;
val.toString(); // return [object String]

// object
new Object().toString();// return [object Object]

// regexp
new Regexp().toString();// return [object Regexp]
var val = /w/ ;
val.toString();// return [object Regexp]

// array
new Array().toString();// return [object Array]
var val = [];
val.toString();// return [object Array]

// function
new Function().toString();// return [object Function]
var val = function(){};
val.toString();// return [object Function]

// error
new Error().toString();// return [object Error]

对于自定义类型:

function Person(name){
	this.name = name ;
}
new Person().toString();// return [object Object]

如果自定义类型覆盖toString方法,如:

Person.prototype.toString = function(){
	return "Person Class";
}

那么,之后

new Person().toString() // return Person Class

因此要在所有对象上都能使用原始的Object.ptototype.toString方法,需要结合Function.prototype.call方法,并将对象作为this参数传递进call方法,如:

var _toString = Object.prototype.toString;

_toString.call(new Person());// return [object Object]

这样相对于typeof来说,使用toString方法来判断不但能区分变量是否是对象类型,甚至可以判断对象的是数组,日期,正则表达式,还是函数。

Ecmascript5.1版本的规范中,toString上调用call方法,并将this参数设置为nullundefined调用后,分别返回'null''undefined'

#####3.jQuery.type()的实现

jQuery中提供了一个用来判断对象内建类型的方法jQuery.type,其内部实现则是结合typeoftoString方法实现的。实现流程其源码如下:

  1. 定义保存类型的全称与简写映射的对象

     // [[Class]] -> type pairs
     class2type = {},
    
  2. 定义保存Object.prototype.toString方法的变量,此处使用的是原型继承来实现

     core_toString = class2type.toString,		
    
  3. 建立实际的映射关系,[object type] -- > type

     // Populate the class2type map
     jQuery.each("Boolean Number String Function Array Date RegExp Object 		Error".split(" "), function(i, name) {
     	class2type[ "[object " + name + "]" ] = name.toLowerCase();
     });
    
  4. 实现jQuery.type方法,并扩展到jQuery中,以下是简化版

     jQuery.extend({
     	type: function( obj ) {
     		if ( obj == null ) {
     			return String( obj );
     		}
     		return typeof obj === "object" || typeof obj === "function" ?
     		class2type[ core_toString.call(obj) ] || "object" :
     		typeof obj;
     	}
     });
    

jQuery.type方法调用返回的是字符串类型,所有返回值包括'object','null','undefined','date','number','function','array','string','regexp','boolean'

javascript中 null == undefined会返回true

具体实例,参见jQuery.type官网API

Reference:

© 著作权归作者所有

big军
粉丝 35
博文 54
码字总数 90542
作品 0
浦东
程序员
私信 提问
细说JavaScript数据类型及转换

细说JavaScript数据类型及转换 JavaScript数据类型 1.Boolean(布尔) 布尔:(值类型)var b1=true;//布尔类型 2.Number(数字) 数值:(值类型)var n1=3.1415926;//数值类型 n1.toFixed...

开元中国2015
2015/07/13
0
0
由js数组类型判断触发的浪漫思绪

一、前言 众所周知,js是门“动态”、“弱类型”编程语言,这意味着在js中可以很任性的定义变量,任性的同时也意味着需常在开发中对变量做类型判断,曾几何时,对数组变量的类型的判断是件很...

hanmin
2018/06/08
0
0
js与php在数组与对象之间的差异

摘要:js和php都是弱类型语言,他们都支持跨平台,然后数据在使用时,都不需要定义类型。有点类似于c++的函数模板,自动判断类型。但他们还是有挺多区别的,下面简单的介绍下js和php在数组与...

魏邪乎
2014/07/21
0
0
《一名【合格】前端工程师的自检清单》答案参考(一)

开篇 最近这个文章很火,列了【合格】前端工程师需要掌握的技能表,看到作者一直不断自省和学习来保持竞争力,同为前端工程师深感惭愧,故写下此文简要回答一下文章里提到的技术问题,技术一...

前端李会旺
04/29
0
0
JavaScript 内功心法——数据类型

一、数据类型概况 1.1 原始类型 原始类型:undefined,null,boolean,string,number,symbol 原始类型是没有函数可以调用的,比如 。 但是很多人就会有疑问为什么 可以转换,其实这种情况 ...

石燕平
04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你需要知道的 5 个 Linux 新手会犯的失误

Linux 爱好者们分享了他们犯下的一些最大错误。 终身学习是明智的 —— 它可以让你的思维敏捷,让你在就业市场上更具竞争力。但是有些技能比其他技能更难学,尤其是那些小菜鸟错误,当你尝试...

xiangyunyan
5分钟前
0
0
来迟了,用Python助你叠猫猫,抢618大红包!

目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 逛店铺流程回顾 5 代码全景展示 6 总结 0 引言 最近叠猫猫的活动可真是十分的火爆,每天小伙伴们为了合猫猫忙的可谓是如火如荼。为啥要叠猫猫...

上海小胖
12分钟前
0
0
FPGA 设备 USB Platform Cable USB

lsusbFuture Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC

MtrS
今天
4
0
lua web快速开发指南(6) - Cache、DB介绍

"数据库"与"缓存"的基本概念 数据库与缓存是服务端开发人员的必学知识点. 数据库 "数据库"是一种信息记录、存取的虚拟标记地点的集合统称. 比如现实生活中, 我们经常会用到文件柜、书桌等等数...

水果糖的小铺子
今天
9
0
Oracle分页查询语句的写法

Oracle分页查询语句的写法 Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,Oracle分页查询语句基本上可以按本文给出的格式来进行套用。   Oracle分...

康师傅
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部