一、typeof 操作符

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

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

二、instanceof

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

  1. var arrayStr=new Array("","","","","");
  2. 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]],然后把类型检测转化为字符串比较,以达到我们的目的。
  1. function isArray(obj) {
  2. return Object.prototype.toString.call(obj) === '[object Array]';
  3. }

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 对象,而每一个变量,都是与其类型相应的对象的一个实例。

  1. var num = ;
  2. alert(Object.prototype.toString.call(num)); // [object Number]
  3. var str = 'hudidit.com';
  4. alert(Object.prototype.toString.call(str)); // [object String]
  5. var boo = true;
  6. alert(Object.prototype.toString.call(boo)); // [object Boolean]
  7. var fun = function(){};
  8. alert(Object.prototype.toString.call(fun)); // [object Function]
  9. var obj = {};
  10. alert(Object.prototype.toString.call(obj)); // [object Object]
  11. var arr = [];
  12. alert(Object.prototype.toString.call(arr)); // [object Array]

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

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

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

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

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. 3dContactPointAnnotationTool开发日志(二十)

      为了使工具更人性化,我又在每个status的text上绑了个可以拖拽实现值改变的脚本,但是不知道为啥rotx那个值越过+-90范围后连续修改就会产生抖动的现象,试了很多方法也没能弄好,不过实际用起 ...

  2. 软工实践原型设计——PaperRepositories

    软工实践原型设计--PaperRepositories 写在前面 本次作业链接 队友(031602237吴杰婷)博客链接 pdf文件地址 原型设计地址(加载有点慢...) 结对成员:031602237 ...

  3. 不清楚System.Diagnostics.Process.Start(e.LinkText); 的含义

    using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms ...

  4. 请问:在delphi中怎样判断DBgrid中数据是否被修改,以便在退出窗口时加以提示

    若DBGrid.DataSource.DateSet为ADOQuery1,这样试一下:if ADOQuery1.Modified then ... procedure TForm1.FormClose ...

  5. matlab eval【转】

    Matlab 简单谈谈EVAL函数的用法 EVAL(s)相当于把字符串s的内容作为语句来执行. 比如:eval('a=3*5') 和直接在command 窗口中输入 a=3*5 等效 eval 一个经 ...

  6. BZOJ 1789 Y形项链(思维)

    这题类似于1787,最后的节点一定是两点的LCA,这里也就是两个字符串的最长公共前缀. # include <cstdio> # include <cstring> # inc ...

  7. python字典的常用操作

    # dic={[1,2,3]:'123'} #可变类型不能当做字典的key,value可以使用任意类型 # dic={(2,3,4):'123'} # print (dic[(2,3,4)]) #元组 ...

  8. .Net MVC 实现长轮询

    什么是长轮询? 长轮询是“服务器推”技术实现方式的一种,可以将服务端发生的变化实时传送到客户端而无须客户端频繁的地刷新.发送请求. 长轮询原理? 客户端向服务器发送Ajax请求,服务器接收到请求后,保 ...

  9. Luogu1053 NOIP2005篝火晚会

    首先造出所要求的得到的环.如果将位置一一对应上,答案就是不在所要求位置的人数.因为显然这是个下界,并且脑补一下能构造出方案达到这个下界. 剩下的问题是找到一种对应方案使错位数最少.可以暴力旋转这个环, ...

  10. Andorid API Package ---> android.accessibilityservice

    包名: android.accessibilityservice                     Added in API level 4 URL:http://developer.andro ...