JS检测数据类型

JS中的数据类型

基本数据类型:Undefined、Null、Boolean、Number、String
复杂数据类型:Object
引用类型:Object、Array、Date、RegExp、Function
ES6新增数据类型:Symbol

let b = true;
let i = 3;
let s = 'aaa';
let u= undefined;
let n = null;
let a = ['a', 'b', 'c'];
let o = {a: 'a', b: 'b'};
let d = new Date();
let e = /at/g;
let f = function(){};
let m = Symbol();

typeof

typeof操作符是检测基本数据类型的最佳工具,而检测引用类型时统一返回object

console.log(typeof b); //boolean
console.log(typeof i); //number
console.log(typeof s); //string
console.log(typeof u); //undefined
console.log(typeof n); //object
console.log(typeof a); //object
console.log(typeof o); //object
console.log(typeof d); //object
console.log(typeof e); //object
console.log(typeof f); //function
console.log(typeof m); //symbol

typeof null 返回’object’,因为特殊值null被认为是一个空的对象引用。
Safari 5 及之前版本、Chrome 7及之前版本对正则表达式调用typeof操作符时会返回‘function’,而其他浏览器在这种情况下会返回‘object’

instanceof

typeof是检测基本类型的有力工具,但检测引用类型时,这个操作符用处不大,于是instanceof派上用场
如果变量是给定引用类型的实例,那instanceof操作符会返回true

console.log(b instanceof Boolean); // false
console.log(i instanceof Number); // false
console.log(s instanceof String); // false
console.log(u instanceof Object); // false
console.log(n instanceof Object); // false
console.log(a instanceof Array); // true
console.log(o instanceof Object); // true
console.log(d instanceof Date); //true
console.log(e instanceof RegExp); //true
console.log(f instanceof Function); // true
console.log(s instanceof Symbol); // false

根据规定,所有引用类型的值都是Object的实例。因此,在检测一个引用类型值和Object构造函数时,instanceof 操作符始终会返回true。如果使用instanceof操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对象。

constructor

constructor 可以检测类型,但由于构造函数指向可以变改变,这个方法并不可靠

console.log(b.constructor === Boolean); // true
console.log(i.constructor === Number); // true
console.log(s.constructor === String); // true
console.log(a.constructor === Array); // true
console.log(o.constructor === Object); // true
console.log(d.constructor === Date); //true
console.log(e.constructor === RegExp); //true
console.log(f.constructor === Function); // true
console.log(m.constructor === Symbol); //true

Object.prototype.toString.call

安全的类型检测方法

console.log(Object.prototype.toString.call(b)); //[object Boolean]
console.log(Object.prototype.toString.call(i)); //[object Number]
console.log(Object.prototype.toString.call(s)); //[object String]
console.log(Object.prototype.toString.call(a)); //[object Array]
console.log(Object.prototype.toString.call(o)); //[object Object]
console.log(Object.prototype.toString.call(d)); //[object Date]
console.log(Object.prototype.toString.call(e)); //[object RegExp]
console.log(Object.prototype.toString.call(f)); //[object Function]
console.log(Object.prototype.toString.call(m)); //[object Symbol]

Array.isArray()

支持Array.isArray()方法的浏览器有IE9+、Firefox 4+、Opera 10.5+和Chrome

封装的类型检测方法

function getType(obj){
  let type  = typeof obj;
  if(type != "object"){
    return type;
  }
  return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章