回答
JS的typeof并不总是返回'object',但它确实返回了一些人们可能不认为是对象的东西 - 也就是数组,还有,奇怪的是,对于空值。
对于数组来说这是正确的,因为就JS而言,数组是对象;他们是一样的东西。数组只是另一个类,您可以实例化Array类型的对象,但它们仍然被视为对象。
This page有一个JS类型的列表,以及你从typeof得到的每一个响应。它还有一些JS代码来覆盖typeof函数,并返回更有用的信息。如果你担心它没有用,你可以按照你的意愿实施。
Google Chrome现在为我返回'function',当我提供'typeof数组'(或任何其他类型的数组,如Int8Array或Float32Array)... – 2017-07-13 08:56:04
链接已死:/ – 2018-02-16 18:44:50
它并不总是返回“对象”:
alert(typeof "hello");
这就是说,(可能)更多有用的技巧来检查的对象是使用Object.prototype.toString.call()
,看看结果:
var t = Object.prototype.toString.call(itIsAMystery);
这将给你一个字符串像[object Foo]
与“Foo”
构造(我认为)
有趣的部分。对于“本地”类型(如Date或String),您可以返回该构造函数名称。
* ...其中“Foo”是... * [[Class]]内部属性的值,它表示本地对象的*值*一个规范定义*分类* - 不是一个*类型*! - 对于主机对象,它基本上可以是任何东西.... – CMS 2010-09-24 14:33:55
哇谢谢@CMS! – Pointy 2010-09-24 16:17:44
请注意,'typeof'运算符_does_总是返回''object''作为函数的'this'范围_(除非范围恰好是函数)_。请参见[“为什么typeof返回”对象“?”](http://stackoverflow.com/questions/4390658/why-does-typeof-this-return-object) – Phrogz 2010-12-08 18:04:21
您必须明白,JavaScript中的类型系统是动态的,只需构建一些“主要”类型。通过将所有复杂对象视为类型“对象”,这允许您使用鸭式和调用方法,而不必知道被传递的对象的类型,假定该类型实现了函数调用。在动态编程语言中,一切都是“对象”。
鸭子类型的语言并不总是省略类型 - 例如,Python是鸭子类型和有一个有用的type()告诉你对象的类型。 – mikemaccana 2011-01-30 19:02:52
您可能能够将任何类型的文件传递到任何位置,但这并不意味着除对象外还有_no_类型。 – byxor 2017-02-02 15:37:05
根据我的经验,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;
}
}
}
人们需要小心一点与typeof运算符。它为null返回“object”,NaN返回“number”,Infinity返回“number”,为数组返回“new Number(1)”和“object”的“object”。
当检查变量的存在(typeof variable!==“undefined”)时,有时需要首先检查是否(变量== null),因为typeof返回分配给null的变量的“object”。
这有点显而易见,但是在检查typeof时也必须小心不要调用函数,因为函数的返回类型将被报告而不是“函数”。
这对我的情况很有帮助,因为我有数字,字符串,空值和正在迭代的对象。我能够从零值中分离出物体来转换它们。 – 2016-01-05 11:38:57
要添加其他值,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]
- 1. 为什么`typeof this`返回“object”?
- 2. 为什么JavaScript从valueOf()而不是[object]返回[object Object]?
- 3. 为什么typeof(Object [,] [])。Name等于“Object [] [,]”?
- 4. 为什么我的POST返回[object Object]
- 5. typeof的返回类型是什么?
- 6. 为什么val()函数返回[object Object]?
- 7. 为什么`typeof false || undefined`返回“布尔”
- 8. 为什么typeof 3> 2在javascript控制台中返回false?
- 9. 什么时候和为什么List remove(Object object)返回false
- 10. 为什么file_exists总是返回false?
- 11. 为什么strptime总是返回NA?
- 12. 为什么mysqli_num_rows总是返回0?
- 13. 为什么DynamicMethod.DefineParameter总是返回null?
- 14. 为什么malloc总是返回NULL
- 15. 为什么recaptcha.IsValid总是返回True
- 16. 为什么StackWalk64总是返回true?
- 17. 为什么indexPathForItemAtPoint总是返回零
- 18. 为什么IndexOf总是返回零?
- 19. 为什么getCallingActivity总是返回null?
- 20. 为什么QFile :: canReadLine()总是返回false?
- 21. 为什么程序总是返回'false'?
- 22. 为什么scanf总是返回1?
- 23. 为什么document.implementation.hasFeature()总是返回true?
- 24. 为什么mysqli num_rows总是返回0?
- 25. 为什么PeekMessage总是返回TRUE?
- 26. 为什么IsInRole总是返回false?
- 27. 为什么WP AJAX总是返回0?
- 28. 为什么dataContext.GetChangeSet()。Deletes.Count()总是返回0?
- 29. 为什么总是返回一个?
- 30. 为什么getUser()总是返回0?
它,因为它没有做到这一点是非常有用的。 – 2010-09-24 14:15:13
某些客户返回类型为'getElementsByTagName'的方法返回的nodeLists的typeof ='function'。我提到它是因为它最近在我的Windows上使用Safari时咬了我一口。 – kennebec 2010-09-24 15:53:48
'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