2010-09-24 170 views
12

如果它总是返回“object”类型,它有什么用?为什么javascript的typeof总是返回“object”?

--update

总是元素或列表。

+11

它,因为它没有做到这一点是非常有用的。 – 2010-09-24 14:15:13

+0

某些客户返回类型为'getElementsByTagName'的方法返回的nodeLists的typeof ='function'。我提到它是因为它最近在我的Windows上使用Safari时咬了我一口。 – kennebec 2010-09-24 15:53:48

+0

'console.log(typeof“foo”); // string&&console.log(typeof String(“foo”)); // string' 'console.log(typeof new String(“foo”)); // object'注意'new'的使用# – Jowen 2013-08-29 14:29:17

回答

20

JS的typeof并不总是返回'object',但它确实返回了一些人们可能不认为是对象的东西 - 也就是数组,还有,奇怪的是,对于空值。

对于数组来说这是正确的,因为就JS而言,数组是对象;他们是一样的东西。数组只是另一个类,您可以实例化Array类型的对象,但它们仍然被视为对象。

This page有一个JS类型的列表,以及你从typeof得到的每一个响应。它还有一些JS代码来覆盖typeof函数,并返回更有用的信息。如果你担心它没有用,你可以按照你的意愿实施。

+0

Google Chrome现在为我返回'function',当我提供'typeof数组'(或任何其他类型的数组,如Int8Array或Float32Array)... – 2017-07-13 08:56:04

+0

链接已死:/ – 2018-02-16 18:44:50

5

它并不总是返回“对象”:

alert(typeof "hello"); 

这就是说,(可能)更多有用的技巧来检查的对象是使用Object.prototype.toString.call(),看看结果:

var t = Object.prototype.toString.call(itIsAMystery); 

这将给你一个字符串像[object Foo]与“Foo” 构造(我认为) 有趣的部分。对于“本地”类型(如Date或String),您可以返回该构造函数名称。

+1

* ...其中“Foo”是... * [[Class]]内部属性的值,它表示本地对象的*值*一个规范定义*分类* - 不是一个*类型*! - 对于主机对象,它基本上可以是任何东西.... – CMS 2010-09-24 14:33:55

+0

哇谢谢@CMS! – Pointy 2010-09-24 16:17:44

+0

请注意,'typeof'运算符_does_总是返回''object''作为函数的'this'范围_(除非范围恰好是函数)_。请参见[“为什么typeof返回”对象“?”](http://stackoverflow.com/questions/4390658/why-does-typeof-this-return-object) – Phrogz 2010-12-08 18:04:21

-1

您必须明白,JavaScript中的类型系统是动态的,只需构建一些“主要”类型。通过将所有复杂对象视为类型“对象”,这允许您使用鸭式和调用方法,而不必知道被传递的对象的类型,假定该类型实现了函数调用。在动态编程语言中,一切都是“对象”。

+0

鸭子类型的语言并不总是省略类型 - 例如,Python是鸭子类型和有一个有用的type()告诉你对象的类型。 – mikemaccana 2011-01-30 19:02:52

+0

您可能能够将任何类型的文件传递到任何位置,但这并不意味着除对象外还有_no_类型。 – byxor 2017-02-02 15:37:05

2

根据我的经验,typeof的主要问题来自于区分数组,对象和空值(都返回“object”)。

要做到这一点,我首先检查的typeof然后我检查空箱或“对象”的构造函数,像这样:

for (o in obj) { 
    if (obj.hasOwnProperty(o)) { 
     switch (typeof obj[o]) { 
      case "object": 
       if (obj[o] === null) { 
        //do somethign with null 
       } else { 
        if (obj[o].constructor.name === "Array") { 
         //do something with an Array 
        } else { 
         //do something with an Object 
        } 
       } 
       break; 
      case "function": 
       //do something with a function 
       break; 
      default: 
       //do something with strings, booleans, numbers 
       break; 
     } 
    } 
} 
1

人们需要小心一点与typeof运算符。它为null返回“object”,NaN返回“number”,Infinity返回“number”,为数组返回“new Number(1)”和“object”的“object”。

当检查变量的存在(typeof variable!==“undefined”)时,有时需要首先检查是否(变量== null),因为typeof返回分配给null的变量的“object”。

这有点显而易见,但是在检查typeof时也必须小心不要调用函数,因为函数的返回类型将被报告而不是“函数”。

+0

这对我的情况很有帮助,因为我有数字,字符串,空值和正在迭代的对象。我能够从零值中分离出物体来转换它们。 – 2016-01-05 11:38:57

1

要添加其他值,typeof返回对象和基元。 javascript中有5种基本类型:undefined,null,boolean,string和number。其他都是一个对象。当typeof应用于除Function之外的任何对象类型时,它只是返回“object”。应用于函数时,它返回一个函数对象。

因此,举例来说:

  • 的typeof真实的; //返回原始类型“布尔型”
  • typeof 123; //返回原始类型“number”
  • typeof null //返回“object”,这是一个错误,但到目前为止,在另一个ECMAScript版本中没有修复,只是谈论这样做。
  • typeof运算对象//返回“对象”,这是有意义的

为了进一步阐述在非常尖的回答,则在每一个JavaScript对象称为内部属性[[类]在ECMAScript中5.为了要显示对象的实际值,可以使用以下参考[[Class]]属性:Object.prototype.toString。为了避免一些专门的内置对象覆盖toString,你可以使用Call的内部方法来显示实际的对象类型。

因此,而不是获取通用对象从后面的toString:

var dateObject = Object.prototype.toString(new Date); 
document.write(dateObject);//[object Object] 

您可以通过呼叫获得实际的对象类型:

var dateObject = Object.prototype.toString.call(new Date); 
document.write(dateObject);//[object Date] 
相关问题