2009-11-05 92 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或空字符串以外的任何变量。

相关问题