JS数据类型判断

1,037 阅读2分钟

前言

本文是对typeofinstanceof两个操作符的总结。

数据类型

在讲这两个操作符之前,需要把相关的概念先行说明。

ES6前有5种简单数据类型,分别是Undefined, Null, Boolean, Number, String; 还有一种复杂数据类型Object 而ES6又增加了一种Symbol

typeof检测

举例说明

const [a1, b1, c1, d1, e1, f1, g1] = [undefined, null, false, NaN, "abc", {}, Symbol()];
console.log(typeof a1); // undefined
console.log(typeof b1); // object
console.log(typeof c1); // boolean
console.log(typeof d1); // number
console.log(typeof e1); // string
console.log(typeof f1); // object
console.log(typeof g1); // symbol

const h1 = function () {};
console.log(typeof h1); // function

const [i1, j1, l1, m1, n1] = [new Date(), /\s/, Math.sign, Math.PI, []];
console.log(typeof i1); // object
console.log(typeof j1); // object
console.log(typeof l1); // function
console.log(typeof m1); // number
console.log(typeof n1); // object

由此可以看出可以使用typeof检测判断出来的是undefined, boolean, number, symbol, function, string, 但需要注意的是boolean, number, string的值都不能通过new出来的,否则检测出的都是object,而function不受影响,例如:

const a2 = new Boolean(false);
const b2 = new Number(25);
const c2 = new String('abc');
console.log(typeof a2); // object
console.log(typeof b2); // object
console.log(typeof c2); // object

const d2 = new Function('a', 'b', 'return a + b');
console.log(typeof d2); // function

instanceof

因为typeof不能检测出引用的数据类型,例如数组、正则等等使用typeof检测出的都是object

基本类型的数据使用instanceof始终判断false,因为基本类型不是对象

举例

const [a3, b3, c3, d3] = [[], {}, new Date(), /\s/];
console.log(a3 instanceof Array); // true
console.log(b3 instanceof Object); // true
console.log(c3 instanceof Date); // true
console.log(d3 instanceof RegExp); // true

const e3 = new Boolean(false);
const f3 = new Number(25);
const g3 = new String('abc');
console.log(e3 instanceof Boolean); // true
console.log(f3 instanceof Number); // true
console.log(g3 instanceof String); // true

两个意外

值得注意的是有两个意外

const h3 = null;
console.log(h3 instanceof Object); // false

const i3 = function() {};
console.log(i3 instanceof Function); // true
console.log(i3 instanceof Object); // true

为什么会这样呢?

从它的语法中我们可以看出result = variable instanceof constructor它是通过该操作符寻找它的引用类型,而所有引用类型的值都是Object的实例,这也就解释了所有的对象使用instanceof的时候结果都为true

const [a4, b4, c4] = [[], {}, new Date(), /\s/];
console.log(a4 instanceof Object); // true
console.log(b4 instanceof Object); // true
console.log(c4 instanceof Object); // true

null是空对象指针,因此typeof null === 'object',然而null又不是object的引用类型的实例,因此使用instanceof会显示false

参考教程