0
alert(typeof QuizParser.Parser.otherdata['response_set']['answers']["slide_" + _index]['trt']);​

为什么?这不应该简单地提醒字符串undefined吗?如果这是错误的,我应该如何检查该变量是否已定义?

4

4 回答 4

2

该错误与 无关typeof,这是因为您试图访问未定义变量的属性:QuizParser.Parser

于 2012-08-03T22:05:21.580 回答
0

当您使用typeof时,它将返回"undefined"未定义的变量,但在您的情况下,您实际上是在调用typeof. QuizParser.Parser.otherdata必须定义,以免typeof导致错误。例如,如果x未定义,typeof(x)则可以,但typeof(x.something)会导致错误,因为您尝试访问x未定义的内容(为了访问某些内容)

于 2012-08-03T22:06:42.507 回答
0

好吧,如果您选择直接方式,这并不容易:您必须编写类似...

if (typeof QuizParser !== 'undefined' // to check whether the variable defined or not
    && QuizParser.Whatever            // if variable IS defined, we can check its property directly
    && QuizParser.Whatever.Property... 
)

请注意,我们不能跳过“中间”链:如果属性不存在,它将被评估为未定义,下一步将抛出 TypeError: Cannot read property ... of undefined

但是还有另一种方法(这在许多跨浏览器库中很常见) - 使用异常来捕获“丢失的链接”:

try {
  var flag = QuizParser.Whatever.Property.You.Like['equal']['to']['something'] !== undefined;
} catch(e) {}
if (flag) { ... }​ // processing goes here

有了这个,您可以更多地模拟issetPHP 的行为:当且仅当设置了目标对象的端点属性(= not )时,您的flag变量才会设置为。并且通过异常机制,您可以保证不会在您的客户端引发任何错误(完全停止 JS 解析),否则......trueundefined

于 2012-08-03T22:12:48.830 回答
-2

这不是typeof问题所在。事实上,在typeof实际执行“typeof”部分之前,您正在尝试访问空对象的成员。例如,考虑这种情况(并注意它不是 javascript,但这是我试图理解的想法,而不是语言语法)

public class Test
{
    public string teststring;
}

然后你做这样的事情:

Test nullTest; // null

if(typeof(test.teststring) != null)

解析器在测试后看到点的第二秒,就会引发空引用错误,因为您实际上是在尝试调用 null.teststring。相反,您必须执行以下操作:

if(object != null && object.property != null && object.property.propertyOfTheProperty != null) 
//...

以便在任何危险发生之前中断 if 语句的执行。如果了解object' 或property' 的空性对您很重要,您也可以这样做:

if(object != null)
{
    if(object.property != null)
    {
        if(object.property.propertyOfTheProperty != null)
        {
           //...
        }
    }
}
于 2012-08-03T22:07:05.173 回答