一、typeof 操作符

对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时

var arr=new Array("","","","","");
typeof arr //object

二、instanceof

JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。

var arrayStr=new Array("","","","","");
arrayStr instanceof Array//true

三、Object.prototype.toString( )

ECMA-262 :Object.prototype.toString( ) When the toString method is called, the following steps are taken:

1.Get the [[Class]] property of this object.

2.Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.

3.Return Result (2)

上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}

call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则很少有人敢去碰它,所以能一定程度保证其“纯洁性”。

这里我们调用了 Object 对象原型的 toString 方法,如果对象是数组,则该函数返回’[object Array]‘。这种方法也可以用来获得任何其他变量的类型,不管变量的实际类型是什么,返回值都是以 object 开头,因为 Nunmber,String,Boolean,Array,Function 都继承自 JavaScript 内置的 Object 对象,而每一个变量,都是与其类型相应的对象的一个实例。

var num = ;
alert(Object.prototype.toString.call(num)); // [object Number]
var str = 'hudidit.com';
alert(Object.prototype.toString.call(str)); // [object String]
var boo = true;
alert(Object.prototype.toString.call(boo)); // [object Boolean]
var fun = function(){};
alert(Object.prototype.toString.call(fun)); // [object Function]
var obj = {};
alert(Object.prototype.toString.call(obj)); // [object Object]
var arr = [];
alert(Object.prototype.toString.call(arr)); // [object Array]

四、jQuery.isArray([]),源码如下:

isArray: Array.isArray || function( obj ) {
return jQuery.type(obj) === "array";
}
//jQuery.type源码
var class2type = {};
var toString = class2type.toString;
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
type: function( obj ) {
if ( obj == null ) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call(obj) ] || "object" :
typeof obj;
}
所以当传入的是字符串,数字,undefined的时直接返回 typeof obj。当传入的是对象、数组、函数时则直接返回 ( class2type[ toString.call(obj) ] || "object" )。
jQuery定义了class2type的一个对象,并将其初始化为如下的格式:
{
"[object Array]" : "array",
"[object Boolean]" : "boolean",
"[object Date]" : "date",
"[object Error]" : "error",
"[object Function]" : "function",
"[object Number]" : "number",
"[object Object]" : "object",
"[object RegExp]" : "regexp",
"[object String]" : "string"
}

toString方法的返回值正好是class2type对象的key值。所以class2type[ toString.call(obj) ]正好得到我们需要的返回类型字符串。

isFunction: function( obj ) {
return jQuery.type(obj) === "function";
}

javascript 变量类型判断的更多相关文章

  1. javascript学习-类型判断

    javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...

  2. javascript变量类型及作用域

    javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...

  3. js课程 1-3 Javascript变量类型详解

    js课程 1-3  Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...

  4. JS 中对变量类型判断的几种方式

    文章整理搬运,出处不详,如有侵犯,请联系~   数据类型判断和数据类型转换代码工具 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boo ...

  5. JavaScript变量类型检测总结

    JavaScript中的变量类型: 基本类型值:Undefined,Null,Boolean,Number和String. 按值访问(可直接操作保存在变量中的变量值): 复制规则:当复制基本类型值时: ...

  6. C语言变量 类型判断

    变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...

  7. JavaScript 变量类型 保存内存中的位置 和 引用

    1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包 ...

  8. Cocos Creator (JavaScript手机类型判断)

    手机类型判断 var BrowserInfo = { userAgent: navigator.userAgent.toLowerCase() isAndroid: Boolean(navigator ...

  9. javascript数据变量类型判断(JS变量是否是数组,是否是函数的判断)

    function isArray(o) { return Object.prototype.toString.apply(o) === “[object Array]”;}function isFun ...

随机推荐

  1. activity属性设置大全

    activity属性设置大全 android:allowTaskReparenting=["true" | "false"]         是否允许activ ...

  2. 统一日志系统 Log4Net/ExceptionLess

    一.   写在前面 本文Log4Net介绍了基础的方式,大数据量生产环境不能使用,中等日志量请日志单库. 希望爱技术的你不要错过exceptionless和ELK 第四节开始简单配置大牛们推荐的了Ex ...

  3. Java中的多线程=你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  4. javascript中检测一个变量的类型

    /** * 怎么检测一个变量的类型? * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. * 另外还可以适应jQuery ...

  5. [Vue源码分析] v-model实现原理

    最近小组有个关于vue源码分析的分享会,提前准备一下… 前言:我们都知道使用v-model可以实现数据的双向绑定,及实现数据的变化驱动dom的更新,dom的更新影响数据的变化.那么v-model是怎么 ...

  6. [AHOI2008] 逆序对

    link 我们可以很容易的推断出$-1$是单调不降的,若$i>j$且$a_i$与$a_j$都没有填数,若填完之后$a_i>a_j$或者$a_i<a_j$,则对答案产生影响的只在$[i ...

  7. node egg.js使用superagent做文件转发

    使用 egg.js + superagent 进行文件上传转发 // app/controller/file.js const Controller = require('egg').Controll ...

  8. javascript实用例子

    js学习笔记,别错过!很有用的. /////////////////////////////////////////////////////////////////////////////////// ...

  9. Codeforces Round #343 (Div. 2) A

    A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...

  10. AIDL 简单实现

    实现步骤1.建立一个aidl文件,在里面定义好接口,注意里面不能写public修饰符,同接口一样,包名要一致. package com.systemset.aidl; interface ILight ...