alert(typeof QuizParser.Parser.otherdata['response_set']['answers']["slide_" + _index]['trt']);
为什么呢?这不应该只是警告字符串undefined
吗?如果这是错误的,我应该如何检查是否定义了该变量?
答案 0 :(得分:1)
该错误与typeof
无关,这是因为您试图访问未定义变量的属性:QuizParser.Parser
答案 1 :(得分:0)
当您使用typeof
时,它会返回"undefined"
未定义的变量,但在您的情况下,您实际上在调用typeof
之前正在做其他事情。必须定义QuizParser.Parser.otherdata
才能使typeof
不会导致错误。例如,如果未定义x
,typeof(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语句。如果了解object
或property
的无效对您很重要,您也可以这样做:
if(object != null)
{
if(object.property != null)
{
if(object.property.propertyOfTheProperty != null)
{
//...
}
}
}