typeof(未定义的变量)导致错误......?

时间:2012-08-03 21:59:43

标签: javascript

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

为什么呢?这不应该只是警告字符串undefined吗?如果这是错误的,我应该如何检查是否定义了该变量?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

当您使用typeof时,它会返回"undefined"未定义的变量,但在您的情况下,您实际上在调用typeof之前正在做其他事情。必须定义QuizParser.Parser.otherdata才能使typeof不会导致错误。例如,如果未定义xtypeof(x)可以,但typeof(x.something)会导致错误,因为您尝试访问未定义的x(为了访问)东西)

答案 2 :(得分: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

通过这种方式,您可以更多地模拟PHP中的isset行为:当且仅当目标对象的端点属性为flag时,您的true变量才会设置为undefined设置(=不{{1}})。使用异常机制,您可以保证不会在客户端抛出任何错误(完全停止JS解析),否则......

答案 3 :(得分:-2)

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

public class Test
{
    public string teststring;
}

然后你做这样的事情:

Test nullTest; // null

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

第二个解析器在测试后看到点,抛出一个null引用错误,因为你实际上是在尝试调用null.teststring。 相反,你必须做类似的事情:

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

以便在任何危险发生之前执行if语句。如果了解objectproperty的无效对您很重要,您也可以这样做:

if(object != null)
{
    if(object.property != null)
    {
        if(object.property.propertyOfTheProperty != null)
        {
           //...
        }
    }
}