我正在参加「掘金·启航计划」
☘️ JS判断数据类型 的四种方法
工欲善其事必先利其器, 想要知道我们创建的变量是什么数据类型,首先要解决的问题是在 ECMAScript 中如何来确定数据类型。
ECMAScript 主要提供了 typeof 操作符、instanceof 操作符、Object.prototype.toString.call 、constructor 四种方法。
🍄 typeof 操作符
typeof 会对以下数据返回对应的数据类型
- "undefined" 表示值 未定义
- "boolean" 表示值为 布尔值
- "string" 表示值为 字符串
- "number" 表示值为 数值
- "symbol" 表示值为 符号
- "object" 表示值为对象 或 null
- " function" 表示值为 函数
Typeof 操作符可以准确测出 number、string、boolean、undefined、function、symbol 共六种数据类型
对象、null、数组、Set、Map、RegExp等类型, typeof 只能测出为 object 不能进一步判断他们的类型
总结:
- 对于基本类型, 除 null 以外均可以返回正确的结果
- 对于引用类型,除 function 以外, 一律返回 object 类型
- 对于 null, 返回 object 类型
- 对于 function 返回 function 类型,
- class 类也返回 function, 因为class 类本质上就是一个函数,自身指向的是构造函数
- 实例化类返回 object, 是因为实例化的是一个对象
🍄 instanceof 操作符: 复杂数据类型判断
obj instanceof Object: 左边是要判断的变量右边是类型, 判断 obj 是否为 Object 的实例
Instanceof 只能用来判断复杂数据类型, 它用来检测给定的构造函数(右侧)的 prototype 是否出现在左侧变量的原型链上。
- 基本数据类型不能用 instanceof 判断类型;
- 基本数据包装类创建的对象可以用 instanceof 来判断,比如 new String("hello");
- undefined 和 null 没有构造函数,所以使用 instanceof 会报错;
instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
let arr = new Array([1, 2, 3])
console.log(arr instanceof Array);
let set = new Set()
console.log(set instanceof Set);
🍄 Object.prototype.tostring.call() (accurate) 所有类型都可以判断。
🍄 constructor
参考文献
JavaScript 判断数据类型的方法
JavaScript高级程序设计(第4版) (Matt Frisbie) 3.4.1