Day04 - 判断数据类型的方式有哪些?

127 阅读1分钟

JavaScript 判断数据类型的方式共有四种

  • typeof 、instanceof 、constructor 、Object.prototype.toString

  • 1、typeof 用法{console.log(typeof 123)}

    • 结果:(number,string,boolean,symbol,undefined,function,object)
    • typeof可以准确判断除null之外的所有基本数据类型以及Function`
    • 针对最后的object:对于 null 及其他引用数据类型(各种类)都返回 object
    • 注意:typeof NAN === 'number'返回true
  • 2、instanceof 用法{console.log([] instanceof Array)}

    • 不能判断基本数据类型,因为基本数据类型并不是构造函数的实例,没有原型链。
    • 因为原型链的终点是 Object.protype => null,所以引用数据类型的原型链上都会存在 Object.protype,所以引用数据类型 instanceof Object 的时候都返回 true
    • 原型链可以被修改,所以结果值不一定准确。
  • 3、constructor 用法{console.log((123).constructor)}

    • 结果:(Number,String,Boolean,Symbol,Array,Object,Function,Date,RegExp,Error)
    • 可以判断 null 和 undefined 除外的所有数据类型,之所以 null 和 undefined 不可以,是因为他们作为 JavaScript 运行环境创建时就存在的基本数据类型,不存在 constructor 属性
    • 基本数据类型为什么会有 constructor 属性呢? 因为基本数据类型获取 constructor 属性的时候,JavaScript 自动将基本数据类型的值转为包装对象实例,并在使用后立刻销毁实例。
    • 缺点:constructor 属性可以被修改,所以结果值不一定准确。
  • 4、Object.prototype.toString 返回对象的类型字符串,用法:Object.prototype.toString.call(target)

    • 结果样式: '[object Number]'
// '[object Number]'
console.log(Object.prototype.toString.call(123))
// '[object String]'
console.log(Object.prototype.toString.call('123'))
// '[object Boolean]'
console.log(Object.prototype.toString.call(true))
// '[object Symbol]'
console.log(Object.prototype.toString.call(Symbol(123)))
// '[object Array]'
console.log(Object.prototype.toString.call([]))
// '[object Object]'
console.log(Object.prototype.toString.call({}))
// '[object Function]'
console.log(Object.prototype.toString.call(function(){}))
// '[object Undefined]'
console.log(Object.prototype.toString.call(undefined))
// '[object Null]'
console.log(Object.prototype.toString.call(null))
// '[object Date]'
console.log(Object.prototype.toString.call(new Date()))
// '[object RegExp]'
console.log(Object.prototype.toString.call(/\d/g))
// '[object Error]'
console.log(Object.prototype.toString.call(new Error()))