alert(typeof QuizParser.Parser.otherdata['response_set']['answers']["slide_" + _index]['trt']);
为什么?这不应该简单地提醒字符串undefined
吗?如果这是错误的,我应该如何检查该变量是否已定义?
alert(typeof QuizParser.Parser.otherdata['response_set']['answers']["slide_" + _index]['trt']);
为什么?这不应该简单地提醒字符串undefined
吗?如果这是错误的,我应该如何检查该变量是否已定义?
该错误与 无关typeof
,这是因为您试图访问未定义变量的属性:QuizParser.Parser
当您使用typeof
时,它将返回"undefined"
未定义的变量,但在您的情况下,您实际上是在调用typeof
. QuizParser.Parser.otherdata
必须定义,以免typeof
导致错误。例如,如果x
未定义,typeof(x)
则可以,但typeof(x.something)
会导致错误,因为您尝试访问x
未定义的内容(为了访问某些内容)
好吧,如果您选择直接方式,这并不容易:您必须编写类似...
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
有了这个,您可以更多地模拟isset
PHP 的行为:当且仅当设置了目标对象的端点属性(= not )时,您的flag
变量才会设置为。并且通过异常机制,您可以保证不会在您的客户端引发任何错误(完全停止 JS 解析),否则......true
undefined
这不是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)
{
//...
}
}
}