了解Javascript中的typeof运算符

nas*_*eez 5 javascript typeof

我遇到了下表,该表说明了[[Class]]对象的内部属性以及typeof操作员返回的相应值。

Value               Class      Type
-------------------------------------
"foo"               String     string
new String("foo")   String     object
1.2                 Number     number
new Number(1.2)     Number     object
true                Boolean    boolean
new Boolean(true)   Boolean    object
new Date()          Date       object
new Error()         Error      object
[1,2,3]             Array      object
new Array(1, 2, 3)  Array      object
new Function("")    Function   function
/abc/g              RegExp     object (function in Nitro/V8)
new RegExp("meow")  RegExp     object (function in Nitro/V8)
{}                  Object     object
new Object()        Object     object
Run Code Online (Sandbox Code Playgroud)

这里要注意的一件事是typeof正确返回Javascript中关联的原始数据类型。

但是,它object为从继承的数组Array.prototype返回一个function类型,但为从继承的函数返回一个类型Function.prototype

鉴于一切都是Javascript中的对象(包括数组,函数和原始数据类型对象),我发现typeof运算符的这种行为非常不一致。

有人可以阐明typeof操作员在现实中的工作方式吗?

lon*_*day 5

这是有点奇怪、特殊的 Javascript 行为。它是从 Javascript 的早期继承而来的,今天可能不会以这种方式编写。

尽管如此,Javascript 已经到了我们现在的处境,所以我们必须处理它!

问题是 JavaScript 中的值要么是对象,要么是基元。这是一个设计决定。它们不能是其他任何东西。原语的类型有

  • 字符串
  • 数字
  • 布尔值
  • 符号(来自 ES2015)
  • 特殊价值undefined
  • 特殊值null(也typeof返回object

任何事物和其他一切都是对象。这是设计使然。数组是对象,因此typeof返回object,就像所有其他不可调用的对象(即函数)一样。请参阅的规格typeof

更好的问题是问为什么要测试某个东西是否是数组。您可能不需要,尤其是像 NodeLists 这样的类似数组的对象不是数组,但在很多方面与它们相似。

在大多数情况下,最好的解决方案是调用Array.from提供的值:然后您就知道它是一个数组。