了解Javascript中的typeof运算符

时间:2017-02-16 12:04:49

标签: 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

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

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

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

有人可以说明typeof运算符在现实中的运作方式吗?

2 个答案:

答案 0 :(得分:3)

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

尽管如此,我们使用的是Javascript,所以我们必须处理它!

问题是Javascript中的值是对象还是原始值。这是一个设计决定。他们不可能是别的什么。 The types of primitives are

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

任何事物和其他一切都是一个对象。这是设计的。数组是对象,因此typeof返回object,每个其他不可调用的对象(即函数)也返回println!("{:indent$}Indented text!", "", indent=indent); 。请参阅the spec for typeof

更好的问题是询问为什么你要测试某些东西是否是一个数组。您可能不需要,特别是像NodeLists这样的类似数组的对象不是数组,但在很多方面都像它们一样。

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

答案 1 :(得分:0)

在Javascript中使用typeof运算符

    'Typeof' is an operator which is used to return a string description of the type of a variable.

示例

console.log(typeof 42);
 output: "number"

console.log(typeof true);
 output: "boolean"