至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型

520 阅读1分钟

typeof

对于原始数据类型(undefined String Number Boolean null)来说 ,除了null都可以调用typeof显示正确的类型。

typeof null=object //null是一个空对象指针

typeof最适合用来判断一个变量是否为原始数据类型。对引用值的作用不大。我们想知道的是它是什么类型的对象,而不是它是不是对象。

对于引用数据类型来说,除了函数之外,都会显示object。

typeof console.log  // 'function'

instanceof

内部机制是通过判断对象的原型链中是否能找到类型的prototype。只能用来判断引用类型,因为基本数据类型没有原型。

手写instanceof(原型链的向上查找):

function getInstanceof(left,right) {
  //基本数据类型直接返回false
  if((typeof left!=='object'&& typeof left!=='function') || left===null)return false
  let proto=left.__proto__
  //等价于let proto=Object.getPrototypeOf(left)
  while (true){
    //查找到尽头 还没找到
    if(proto===null)return false
    //找到相同的原型对象
    if(proto==right.prototype){
      return true
    }
    proto=proto.__proto__
  }
}

Object.prototype.toString.call()

判断所有的数据类型:

Object.prototype.toString.call(123)       //[object Number]
Object.prototype.toString.call('123')     //[object String]
Object.prototype.toString.call(undefined//[object Undefined]
Object.prototype.toString.call(true//[object Boolean]
Object.prototype.toString.call({})        //[object Object]
Object.prototype.toString.call([])        //[object Array]
Object.prototype.toString.call(function(){}) //[object Function]
Object.prototype.toString.call(Function)     //[object Function]
Object.prototype.toString.call(null//[[object Null]]
Object.prototype.toString.call(new Date());  //[object Date]
Object.prototype.toString.call(/at/);     //[object RegExp]

精确判断所有数据类型的函数:

function getType(obj) {
  if(obj===null)return String(obj)
  return typeof obj==='object' ? Object.prototype.toString.call(obj).replace('[object ','').replace(']','') : typeof obj
}

判断是否是数组?

instanceof

if(value instanceof Array){
       //操作数组
}

Array.isArray()

if(Array.isArray(value)){
       //操作数组
}

Object.prototype.toString.call()

const isArray=function (target) {
    return Object.prototype.toString.call(target)===`[object ${Array}]`
  }
}
if(isArray(value)){
      //操作数组
}

[].constructor === Array

if(value.constructor === Array){
       //操作数组
}

判断null

  1. 最简单的是通过null===null来判断是否为null
  2. 通过原型链的尽头:Object.prototype.proto===a判断a是否为原始对象类型即null
  3. type(a)=='object' && !a 通过typeof判断null为对象,且对象类型只有null转换为Boolean为false