2017-02-16 56 views
3

typeof运算符我来到下表其状态的对象的内部[[Class]]属性及其相应的值,该typeof运营商的回报跨越。了解在Javascript

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 

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

然而,它返回一个object类型从Array.prototype继承的阵列,但返回function型为从Function.prototype继承的功能。由于一切都是Javascript中的对象(包括数组,函数&原始数据类型对象),我发现typeof运算符的这种行为非常不一致。

有人可以扔在typeof操作在现实中是如何工作的一些轻?

+0

您应该考虑** instanceof **处理对象时https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof – ymz

+0

只有某些类型具有特定的结果。每个其他类型都被视为一个对象。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – Armin

+0

如果typeof返回所有对象的'object',因为所有东西都是javascript中的对象,那么它就完全没用了。 –

回答

2

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

尽管如此,我们在哪里,我们都使用Javascript,所以我们必须对付它!

的事情是,在Javascript中值不是对象或他们是原语。这是一个设计决定。他们不能成为别的。 The types of primitives are

  • 数字
  • 布尔
  • 符号(从ES2015)
  • 特殊值undefined
  • 特殊值null(对于该typeof也返回object

任何事情都是一个对象。这是设计。数组是对象,所以typeof返回object,与其他每个不可调用的对象(即函数)一样。见the spec for typeof

最好的问题是询问为什么你想测试一下是否有数组。你可能不需要,特别是像数组类似的对象,比如NodeLists不是数组,但是在很多方面都是这样的。

最好的解决方案在大多数情况下是调用Array.from的价值提供:那么你知道它是一个数组。

+0

为了测试一个数组,我宁愿使用'Array.isArray()'或'instanceof'。只是想知道为什么返回类型的函数和数组的异常。 – nashcheez

+0

@nashcheez答案是数组不是基元的历史决定。 – lonesomeday