js 类型判断

javascript的数据类型可以分为两大类:
原始类型和引用类型.
原始类型(基本数据类型)包括Undefined、Null、Boolean、Number和String五种,及es6中的symbol
引用类型也称为复杂类型,在Javascript中是Object。

如何进行类型判断

typeof 操作符

typeof   2               //   number
typeof   null            //   object
typeof   {}              //   object
typeof    []             //   object
typeof  new Function()     //function
typeof    undefined      //   undefined
typeof   '222’           //   string
typeof  true             //   boolean
  • 对于基本类型,除 null 以外,均可以返回正确的结果。
  • 对于引用类型,除 function 以外,一律返回 object 类型。
  • 对于 null ,返回 object 类型。
  • 对于 function 返回 function 类型。

instanceof

instanceof 检测的是原型,用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。因此,instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
function A(){};
Car.prototype = Object.create(A.prototype);  //Car继承A
var auto = new Car('Honda', 'Accord', 1998);

console.log(auto instanceof Car);
// expected output: true

console.log(auto instanceof A);
// expected output: true

console.log(auto instanceof Object);
// expected output: true

toString

toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

不同类型的具体鉴定方法

Number、String、Boolean、Nndefined可以直接使用typeof进行鉴别

数组(Array)的鉴定

首先typeof 方法并不能鉴别数组

typeof  []    //   object

instanceof操作符默认假定只有一个全局执行环境,当我们的网页中包含多个框架时,就会有多个全局执行环境,可能会导致’[] instanceof Array’的结果返回false。

JavaScript中实现了一个内置函数Array.isArray用于判断某个对象是否是数组,
Array.isArray() 本质上检测的是对象的 [[Class]] 值,[[Class]] 是对象的一个内部属性,里面包含了对象的类型信息,其格式为 [object Xxx] ,Xxx 就是对应的具体类型 。对于数组而言,[[Class]] 的值就是 [object Array] 。

但是由于Array.isArray兼容性(IE 9+/FireFox 4+/Safari 5+/Opera 10.5+/Chrome)存在问题,所以我们不得不考虑到在低级浏览器中的后备方案。

var isArray = nativeIsArray || function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
};

对象(Object)的鉴定

内置对象在使用typeof操作符鉴定其类型时,都会返回“object”,但是有一个例外,就是Function对象

var isObject = function(obj) {
    var type = typeof obj;
    return type === 'function' || type === 'object' && obj;
};

内置对象(Function、Date、RegExp等)的鉴定

同Array的鉴定方法,通过对比Object.prototype.toString返回的字符串与内置对象的名称来判断

几个特殊值的鉴定

NaN的鉴定

我们知道,NaN是一个非常特殊的值,为什么特殊呢?因为其含义为非数值(Not a Number),但是typeof NaN === “number”,因为NaN是JavaScript中唯一一个与任何值都不相等(包括自身)的值:

var isNaN = function(value) {
    return value !== value;
}

其实在ES6中引入了Number.isNaN方法用于鉴定NaN,它与全局函数isNaN的区别在于Number.isNaN在鉴定之前不会对参数进行强制转换,这就确保了鉴定的结果满足严格的定义。

null的鉴定

var isNull = function(obj) {
    return obj === null;
};

你可能感兴趣的:(js)