判断数据类型

JavaScript 是弱类型的编程语言,需要提供一种手段来进行类型的检测 -- typeof。

typeof 操作符

typeof 是操作符不是函数,所以括号不是必须的

typeof 可能会返回一下几种情况:

  • "undefined" -- 如果这个值未定义
  • "boolean" -- 如果这个值是布尔值
  • "string" -- 如果这个值是字符串
  • "number" -- 如果这个值是数字
  • "object" -- 如果这个值是对象或 null
  • "function" -- 如果这个值是函数
  • "symbol" -- 如果这个值是 symbol (es6 新增)
  • "bigint" -- 如果这个值是 bigint (es11 新增)

typeof 这个操作符有着一些迷惑性行为,如 typeof null 的值为 'object' ,在 Chrome 7 和 Safari 5 之前的浏览器对正则使用 typeof 操作符判断类型会返回 'function' ,而其他浏览器则返回 'object' 。对于原始数据类型来说,除了 null 之外,都可以判断类型。

为什么 typeof null 结果为 'object'

这是由于 JavaScript 最初数据类型是 32 位存储的,前三位存储的数据类型,对象类型表示为三个零 000,而 null 表示为空,存储的都是零,所以 typeof 将它判断为 'object' ,虽然现在 typeof 的判断逻辑已经改了,但这个问题由于历史原因,老代码太多,保留了下来。在 JavaScript 红宝石这本书中也提到,null 在逻辑上是一个空对象指针,所以也可以在逻辑上看做一个对象,但它却不是对象。

instanceof 操作符

instanceof 操作符可以判断一个对象是不是一个对象类型,其中通过检测构造函数的 prototype 是否出现在某个对象实例里面。返回 true 或 false。

'hello world' instanceof String // false
new String('你好,世界') instanceof String // true