提升代码可读性——谈谈js 中 typeof 运算符
2023-11-01 07:40:52
js 中 typeof 运算符的作用与实现原理
js 的 typeof 运算符以变量作为输入,输出该变量的数据类型。一般有以下几种情况:
- typeof null === "object"
- typeof undefined === "undefined"
- typeof 123 === "number"
- typeof "abc" === "string"
- typeof [1,2,3] === "object"
- typeof function(){} === "function"
通过上述输出结果,我们可以了解到 typeof 运算符根据 EcmaScript 的规范,将数据类型分为以下 7 种:
- object
- undefined
- boolean
- number
- string
- symbol(ES6 新增)
- function
其中,typeof null === "object" 的结果很特别,因为从直觉上来看,null 应该属于 “null” 类型,而不是 “object” 类型。产生这一结果的原因,是因为早期 js 没有 Null 类型,便借用 Object 类型作为 null 的替代。
typeof 运算符的局限性
1. 不能区分不同引用类型
类型:对象、数组、函数
例:
console.log(typeof new Object() === typeof []) // true
console.log(typeof function(){} === typeof []) // true
由于 js 中 typeof 运算符只返回基本数据类型和引用类型两种结果,因此无法区分不同引用类型。这在很多场景下会带来不便,例如,我们需要判断一个变量是否为数组,或者判断一个变量是否为函数时,typeof 运算符就无能为力了。
2. 不能判断基本数据类型的子类型
类型:数字
例:
console.log(typeof 1 === typeof 3.14) // true
对于基本数据类型,typeof 运算符同样无法区分不同子类型。例如,对于数字类型,typeof 运算符无法区分整数和浮点数。这对某些精度的要求很高的场景来说,可能造成判断错误。
typeof 运算符的替代方案
针对 typeof 运算符的局限性,js 社区提出了多种替代方案:
1. 使用 instanceof 运算符判断引用类型
类型:对象、数组、函数
例:
console.log([] instanceof Array) // true
console.log({}) instanceof Object) // true
console.log(function(){} instanceof Function) // true
instanceof 运算符用于判断一个对象是否是某个类型的实例。这可以有效地解决 typeof 运算符无法区分不同引用类型的问题。
2. 使用 Number.isInteger() 判断数字类型的子类型
类型:数字
例:
console.log(Number.isInteger(1)) // true
console.log(Number.isInteger(3.14)) // false
Number.isInteger() 方法用于判断一个数字是否为整数。这可以有效地解决 typeof 运算符无法区分数字类型子类型的问题。
结语
typeof 运算符是 js 中一个非常重要的类型判断工具,但它也存在一定的局限性。为了解决这些局限性,我们可以使用 instanceof 运算符和 Number.isInteger() 方法来辅助判断类型。这可以有效地提升代码的可读性和健壮性。