JavaScript数据类型判断


一. JS中的数据类型

  • 基本数据类型:StringNumberBooleanUndefinedNullSymbol
  • 引用数据类型:Object

二. 数据类型判断方法

  • typeof
  • instanceof
  • constructor
  • ===
  • Object.is()
  • Array.isArray()
  • isNaN()
  • Object.prototype.toString()

typeof

对一个值使用typeof操作符的返回值(返回值类型为字符串)有以下几种:

  • “undefined” — 值未定义
  • “boolean” — 布尔值
  • “string” — 字符串
  • “number” — 数值
  • “object” — 对象或null
  • “function” — 函数
  • “symbol” — Symbol

instanceof

检测某个变量是否是某个构造函数的实例。常用的一些JS原生引用类型有:

  • o instanceof Object — 变量o是否是Object类型的实例
  • o instanceof Array — 变量o是否是Array类型的实例
  • o instanceof RegExp — 变量o是否是RegExp类型的实例
  • o instanceof Date — 变量o是否是Date类型的实例
  • o instanceof Function — 变量o是否是Function类型的实例
  • o instanceof Boolean — 变量o是否是Boolean类型的实例
  • o instanceof String — 变量o是否是String类型的实例
  • o instanceof Number — 变量o是否是Number类型的实例

constructor

constructor属性是对创建对象的构造函数的引用。

let a = '';
a.constructor === String; // true

a = 5;
a.constructor === Number; // true

new Date().constructor === Date; // true

===

判断两个操作数的数据类型和值是否完全一致。

  • "5" === 5 — false

Object.is()

弥补了全等运算符===存在的两个怪异点:

  • +0 === -0 — true
  • NaN === NaN — false
  • Object.is(+0, -0) — false
  • Object.is(NaN, NaN) — true
    其他判断结果与===结果一致。

Array.isArray()

判断一个值是否是一个Array。解决了网页中存在多个iframe(即存在多个多个全局执行环境),instanceof无法判断Array类型的问题

  • Array.isArray([]) — true
  • Array.isArray(Array.prototype) — true

示例代码:

// 获取窗口中最后一个框架中的Array构造函数
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // [1,2,3]

console.log(Array.isArray(arr));  // true
console.log(arr instanceof Array); // false

isNaN()

判断指定值是否为数字,是数字返回false,否则返回trueisNaN() 在判断参数是否为数字之前,会首先使用 Number() 对参数进行数字类型的转换。所以 isNaN(value) 其实等效于:isNaN(Number(value))。当参数 value 能被 Number() 转换为数字时,结果返回 false,否则返回 true

console.log(isNaN('100'))  // false
console.log(isNaN(''))  // false
console.log(isNaN('100px'))  // true
console.log(isNaN(undefined))  // true
console.log(isNaN({})) // true
console.log(isNaN([])) // false
console.log(isNaN(null)) // false

Object.prototype.toString()

Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('hi') // "[object String]"
Object.prototype.toString.call({a:'hi'}) // "[object Object]"
Object.prototype.toString.call([1,'a']) // "[object Array]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(() => {}) // "[object Function]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"

文章作者: Snail-Lu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Snail-Lu !
  目录