2009-11-05 76 views
0

顯然,這行代碼觸發「預期的對象」:這個「對象預期」的JavaScript錯誤是怎麼可能的?

var bPid = (b != null && typeof (b.processId) == "number") ? b.processId : 0; 

不幸的是我無法通過代碼在調試器中的步驟,因爲這是一個間歇性錯誤,在Windows邊欄小工具,我展示了寫作。但是,我想有人應該能夠告訴我,如果我正在做的所有檢查嘗試阻止這樣的事情,甚至有可能獲得對象預期。

回答

2

您在致電b.processId時未確定b是否爲對象。

+0

不應該'typeof(b.processId)==「number」'阻止我在調用'b.processId'中例如,「b = 3」? – Domenic 2009-11-05 16:29:55

+3

詢問'typeof(b.processId)'使得JavaScript評估'b.processId'。如果'b'爲數字3,則會導致''未定義''。如果'b'本身就是'undefined',則會導致錯誤。 – Tomalak 2009-11-05 16:33:05

+0

我的印象是'typeof'的整點是讓你測試一些屬性是否存在而不實際取消引用。但是,Firebug同意typeof(undefined.processId)給出了一個錯誤,所以我猜不是> _ <。 – Domenic 2009-11-05 16:33:44

4

看來b不是一個對象,所以我會alert(b)之前,看看它是否被賦予一個值。

即使它有一個賦值,它可能不是一個對象,所以你不妨要求typeof(b) == 'object'

+2

但是不應該'b!= null'抓住那個? (請注意,我沒有使用嚴格的等號'==='。 – Domenic 2009-11-05 16:26:24

+1

不是,因爲如果b == 3,那也是!= null。與b是數組一樣。你應該確保它是一個* object *,不僅僅是!= null ... – Seb 2009-11-05 16:27:39

+2

'b'可能是'undefined'。 – Tomalak 2009-11-05 16:27:48

2

您的變量b可能不存在。試試這個:

var bPid = (typeof b != "undefined" && typeof b.processId == "number") ? b.processId : 0; 
+1

會(sl))'var bPid =(b && typeof b.processId ==「number」)? b.processId:0;'是嗎?畢竟,'null'和'undefined'都是「false」。 – Tomalak 2009-11-05 16:29:44

+0

@Tomalak:不,如果* b *不存在,您將得到* ReferenceError *。 – Gumbo 2009-11-05 16:35:32

+1

我的意思是如果'b'是一個聲明的變量,其值爲undefined。 – Tomalak 2009-11-05 16:39:18

2

最安全(和最短)的方式來檢查,如果B變量是「truthy」(道格拉斯Crockford的條款)將

var bPid = (b && typeof (b.processId) == "number") ? b.processId : 0; 

,除非你明確地想比較一下爲null(在這種情況下,你應該比較===不會執行類型轉換)。

而且'truthy'變量是除false,null,undefined,NaN,數字0或空字符串以外的任何變量。

相關問題