typeof、instanceof、Object.prototype.toString.call

148 阅读1分钟

1 - 类型检测

1、typeof

可检测的数据类型:null、undefined、string、number、boolean,object、function,

注意:对于数组、日期、正则都会识别为object

2、instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

console.info(Array instanceof Object) // true

const arr = []
console.info(arr instanceof Array) // true
console.info(arr instanceof Object) // true
console.info(fn instanceof Function) // false

const obj = {}
console.info(obj instanceof Array) // false
console.info(obj instanceof Object) // true
console.info(fn instanceof Function) // false

const fn = () => {}
console.info(fn instanceof Array) // false
console.info(fn instanceof Object) // true
console.info(fn instanceof Function) // true

引用类型 instanceof Object 都是 true

2 - instanceof 对数组、正则、日期对象的检测

①数组:

// 1 - Array.isArray()
console.info(  Array.isArray( [] )  ) // true

// 2 - instanceof
const arr = []
console.info(arr instanceof Array) // true

②正则:

const reg = /^1[3456789]d{9}$/
console.info(reg instanceof RegExp) // true

// 字符串正则需要使用 eval() 转化为正则
const reg = '/^1[3456789]d{9}$/'
console.info(eval(reg) instanceof RegExp) // true

③日期对象:

const date = new Date()
console.info(date instanceof Date) // true

3 - Object.prototype.toString.call 类型检测

对于 Object.prototype.toString() 方法,会返回一个形如 "[object XXX]" 的字符串。

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

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

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

Object.prototype.toString.call(1);               // => "[object Boolean]"

Object.prototype.toString.call("");              // => "[object String]"

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

Object.prototype.toString.call((function() {
  return arguments;
})());                                           // => "[object Arguments]"

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

Object.prototype.toString.call(new Error());     // => "[object Error]"

Object.prototype.toString.call(/\d+/);           // => "[object RegExp]"

Object.prototype.toString.call(new Date());      // => "[object Date]"

Object.prototype.toString.call(new class {});    // => "[object Object]"

Object.prototype.toString.call(function * (){});    // => "[object GeneratorFunction]"