回答
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. 爲什麼javascript typeof總是返回「object」
- 2. 爲什麼`typeof this`返回「object」?
- 3. 爲什麼JavaScript從valueOf()而不是[object]返回[object Object]?
- 4. 爲什麼typeof(Object [,] [])。Name等於「Object [] [,]」?
- 5. 爲什麼console.log()顯示一個數組,但typeof返回'object'?
- 6. 爲什麼我的POST返回[object Object]
- 7. 爲什麼帶有對象的typeof數組返回「Object」而不是「Array」?
- 8. typeof的返回類型是什麼?
- 9. typeof(Array,null)返回object和typeof(null,Array)返回函數
- 10. 爲什麼filter返回[object Object]?
- 11. 爲什麼val()函數返回[object Object]?
- 12. 爲什麼`typeof false || undefined`返回「布爾」
- 13. 爲什麼typeof 3> 2在javascript控制檯中返回false?
- 14. 爲什麼我返回[Object,object]而不是字符串?
- 15. 什麼時候和爲什麼List remove(Object object)返回false
- 16. C#XmlElement:爲什麼總是返回Nulll?
- 17. 爲什麼malloc總是返回NULL
- 18. 爲什麼程序總是返回'false'?
- 19. 爲什麼test.regex總是返回true?
- 20. 爲什麼QFile :: canReadLine()總是返回false?
- 21. 。爲什麼.valid()總是返回TRUE?
- 22. 爲什麼$ result總是返回false?
- 23. 爲什麼FindFirstFileW總是返回-1?
- 24. 爲什麼getPointerCount()總是返回1?
- 25. 爲什麼IndexOf總是返回零?
- 26. 爲什麼Canvas :: GetLeft總是返回0?
- 27. 爲什麼indexPathForItemAtPoint總是返回零
- 28. 爲什麼mysqli_num_rows總是返回0?
- 29. 爲什麼ShowDialog總是返回DialogResult.Cancel?
- 30. 爲什麼evhttp_request_get_connection()總是返回NULL?
它,因爲它沒有做到這一點是非常有用的。 – 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