这个“预期对象”JavaScript错误怎么可能?

这个“预期对象”JavaScript错误怎么可能?,javascript,Javascript,显然,这行代码正在触发预期的对象: var bPid = (b != null && typeof (b.processId) == "number") ? b.processId : 0; 不幸的是,我无法在调试器中单步执行代码,因为这是一个间歇性错误,显示在我正在编写的Windows SideShow小工具中。但是,我想有人应该能够告诉我,在我为防止类似情况而进行的所有检查中,如何才能得到预期的对象。似乎b不是对象,所以我会在那一行之前提醒b,看看它是否被赋值 即使分配了一

显然,这行代码正在触发预期的对象:

var bPid = (b != null && typeof (b.processId) == "number") ? b.processId : 0;
不幸的是,我无法在调试器中单步执行代码,因为这是一个间歇性错误,显示在我正在编写的Windows SideShow小工具中。但是,我想有人应该能够告诉我,在我为防止类似情况而进行的所有检查中,如何才能得到预期的对象。

似乎b不是对象,所以我会在那一行之前提醒b,看看它是否被赋值

即使分配了一个值,它也可能不是一个对象,因此您也可以要求typeofb=='object'。

您正在调用b.processId,但没有确保b是一个对象。

您的变量b可能不存在。试试这个:

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

按照道格拉斯·克罗克福德的说法,检查b变量是否为“truthy”的最安全、最短的方法是

var bPid = (b && typeof (b.processId) == "number") ? b.processId : 0;
除非您显式地希望将其与null进行比较,在这种情况下,您应该与===进行比较,因为它不进行类型协同


“truthy”变量是除false、null、undefined、NaN、数字零或空字符串以外的任何值。

但b不应该是吗!=明白了吗?请注意,我没有使用严格的等式==.Nope,因为如果b==3,那就是!=也为空。b作为数组也是一样的。您应该确保它是一个对象,而不仅仅是!=null…alertundefined==null;//如果b未定义,则在b处短路!=null,因为未定义==null,即使未定义!==null。正如旁注:typeof是一个运算符,而不是一个函数。请参阅一个草率的变量bPid=b&&typeof b.processId==number?b、 processId:0;做毕竟,null和undefined的计算结果都为false。@Tomalak:不,如果b不存在,您将得到一个引用错误。我的意思是如果b是一个声明的变量,且具有未定义的值。typeofb.processId==number不应该阻止我在,例如,b=3?询问b.processId的类型会使JavaScript计算b.processId。如果b是数字3,这将导致未定义。如果b本身未定义,它将导致一个错误。我的印象是typeof的全部目的是让你在不去引用它的情况下测试某个属性是否存在。但是,Firebug同意typeofundefined.processId给出了一个错误,所以我想不是>\u等等,您正在使用JScript引擎?我敢打赌这是JScript的一个怪癖|var b=3;var c=b.processId;|这不是一个错误。b===undefined不会像您正确地说的那样通过空检查。