View on GitHub

blog

博客;温故而知新

js 类型检查

js中有5中基本数据类型,分别是: Undefined,Null,Boolean,Number,String 还有一种复杂数据类型: Object

ECMAScript是松散类型的,所以使用以上6种数据类型,就可以表示所有数据。 那么,如何检测变量的数据类型呢。

下面就介绍几种在业务代码中,常用的几种常用类型检查方法

typeof

typeof操作符用以获取一个变量或者表达式的类型。

####typeof一般只能返回如下几个结果: - “number”, ——eg: typeof 2 - “boolean”, —– eg: typeof false - “string”, ——– eg: typeof “123” - “function”(函数,),—— eg: typeof function(){} - “object”(null,数组,对象,正则表达式), — typeof /\s/ - “undefined”。 —— typeof hehe

** 从上面结果可以看到, 使用typeof 在检查 null,数组,对象,正则表达式时都会返回”object” ** 如此模糊的类型检查方法,应用场景也十分有限。

instanceof

如果想知道一个变量到底是什么类型的 “object”,就可以使用instanceof,

  var pattern = /\s/;
  var arr = [1,2,3];
  var obj = new Object();

  alert(pattern instanceof RegExp);   // true
  alert(arr instanceof Array);        //true
  alert(obj instanceof Object);        //true
  alert(null instanceof Object);      // false;

也可以用来检查自己创建的变量:

var a = new Array();
console.log(a instanceof Array) // 返回true。
console.log(a instanceof Object) // 返回  Array 是object 的子类。也会返回true.

但是这个操作符的问题在于它假定只存在一个全局的执行环境,存在多个框架的情景下,会存在两个不同的数组构造函数,这里就引入了另一个方法来判断数组

isArray()

ECMAScript5 新增的Array.isArray() 方法,无论执行环境,只有一个目的,判断是不是数组

Object.prototype.toString.call()

原生的toString() 方法,都会返回一个[object NativeConstructorName] 格式的字符串, 通过判断每个类在内部的[[Class]] 属性,来检查类型

    var a = new Array()
    Object.prototype.toString.call(a) == "[object Array]"`
    // 使用这种方法不仅可以判断数组,还可以判断其他类型。
   Object.prototype.toString.call(value) =="[object Function]"
    {}.prototype.toString.call(value) =="[object JSON]" //这种方法也可以 检查原生的JSON对象

$.type

zeptov1.0+ 具体用法可以查看 官网文档,用法如下

$.type(object)   ⇒ string
获取JavaScript 对象的类型。可能的类型有:
null undefined boolean number string function array date regexp object error。

alert($.type([]))  // "array"
alert($.type("11"))  // "string"
alert($.type({}))    // "object"

然后,我们可以分析下,这个$.type 方法,使用的技巧是否不同于上面几种类型检查方法 查看 zepto@1.1.6 的源码,基本和上面的 toString.call() 方法类似

type 方法的部分如下

  function type(obj) {
    return obj == null ? String(obj) :
      class2type[toString.call(obj)] || "object"
  }

代码的关键部分,就是这个class2type 对象里面存放了所有数据类型对应的字符串,使用type 方法是,直接取class2type 里面的键值对即可。

再往下看,就可以发现 使用each 方法 ,遍历所有可能的数据类型,为class2type赋值。

  $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase()
  })

这里得到的 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"
}

当然,我们可以直接把class2type 对象拿来使用。