我遇到了下表,该表说明了[[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操作员在现实中的工作方式吗?
这是有点奇怪、特殊的 Javascript 行为。它是从 Javascript 的早期继承而来的,今天可能不会以这种方式编写。
尽管如此,Javascript 已经到了我们现在的处境,所以我们必须处理它!
问题是 JavaScript 中的值要么是对象,要么是基元。这是一个设计决定。它们不能是其他任何东西。原语的类型有:
undefinednull(也typeof返回object)任何事物和其他一切都是对象。这是设计使然。数组是对象,因此typeof返回object,就像所有其他不可调用的对象(即函数)一样。请参阅的规格typeof。
更好的问题是问为什么要测试某个东西是否是数组。您可能不需要,尤其是像 NodeLists 这样的类似数组的对象不是数组,但在很多方面与它们相似。
在大多数情况下,最好的解决方案是调用Array.from提供的值:然后您就知道它是一个数组。