2010-09-24 38 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] 
相關問題