js 判断数据类型

常用判断方法:

1. typeof

typeof 共返回6种数据格式,只能判断区分基本类型: number、string、boolean、undefined、object 以及 function

typeof 0;             //number
typeof true;          //boolean
typeof "string";      //string

typeof undefined;         //undefined
typeof function(){};      //function

typeof null;   //object
typeof {};     //object
typeof [];     //object    

对象和数组 无法区分。

 

2. instanceof

instanceof 运算符用来检测 右侧 constructor.prototype 是否存在于 左侧参数 object 的原型链上。即:

A instanceof B   // 检测构造函数B的原型是否有出现在对象A的原型链上。

因此,instanceof 运算符只能用于对象,不能用于原始类型的值

let a = true
let b = new Boolean(true)
a instanceof Boolean          // false
b instanceof Boolean          // true

检测引用类型时,对于数组的校验也是不尽人意

let c={};
c instanceof Object   //true
c instanceof Array    //false
let d=[];
d instanceof Object   //true
d instanceof Array    //true

 

3. constructor

constructor可以区分Array和Object,也能支持各种类型的判断,如下

(1).constructor === Number                     // true
(true).constructor === Boolean                 // true
('string').constructor === String              // true
([]).constructor === Array                     // true
(function() {}).constructor === Function       // true
({}).constructor === Object                    // true

但是,存在两大缺陷

(1)null 和 undefined 是无效的对象,不存在 constructor ,无法以此来作判断。

(2)constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的 constructor 给覆盖了,这样检测出来的结果就是不准确的

function Fn(){};
 
Fn.prototype=new Array();
 
var f=new Fn();
 
console.log(f.constructor===Fn);    // false
console.log(f.constructor===Array); // true

 

4. Object.prototype.toString.call()

最准确最常用的方式。先获取 Object 原型上的 toString 方法,让方法执行,让 toString 方法中的 this 指向第一个参数的值。

Object.prototype.toString.call(1)
//"[object Number]"

Object.prototype.toString.call('string')
//"[object String]"

Object.prototype.toString.call(true)
//"[object Boolean]"

Object.prototype.toString.call([])
//"[object Array]"

Object.prototype.toString.call({})
//"[object Object]"

Object.prototype.toString.call(function(){})
//"[object Function]"

Object.prototype.toString.call(undefined)
//"[object Undefined]"

Object.prototype.toString.call(null)
//"[object Null]"

 

 

prototype.js 中用于获取对象的类型名

/**
 * Returns internal [[Class]] property of an object
 *
 * Ecma-262, 15.2.4.2
 * 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).
 *
 * __getClass(5); // => "Number"
 * __getClass({}); // => "Object"
 * __getClass(/foo/); // => "RegExp"
 * __getClass(''); // => "String"
 * __getClass(true); // => "Boolean"
 * __getClass([]); // => "Array"
 * __getClass(undefined); // => "Window"
 * __getClass(Element); // => "Constructor"
 *
 */
function __getClass(object){
  return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
};

借此,可扩展为 js 工具:

var is ={
  types : ["Array", "Boolean", "Date", "Number", "Object", "RegExp", "String", "Window", "HTMLDocument"]
};
for(var i = 0, c; c = is.types[i]; i ++){
  is[c] = (function(type){
    return function(obj){
      return Object.prototype.toString.call(obj) == "[object " + type + "]";
    }
  })(c);
}
console.log(is.Array([]));       // true
console.log(is.Date(new Date));    // true
console.log(is.RegExp(/reg/ig));   // true
posted @ 2018-10-26 15:52  晨の风  阅读(236)  评论(0编辑  收藏  举报