我想布尔来出这个表达式
(task === undefined);
其中task
是任意的,根本不会出现在代码中。
然而,当我在rhino中运行它时,我得到一个引用错误。我想要
为什么我不成真?
我想检查是否已定义特定变量。如果这不起作用,我该怎么办呢?
答案 0 :(得分:60)
使用此:
(typeof task === "undefined")
当您使用(task === undefined)
时,Javascript需要找到task
的值以查看它是否与undefined
相同,但它无法查找名称,因为它不会不存在,给你参考错误。 typeof
的特殊之处在于它可以安全地返回不存在的名称类型。
答案 1 :(得分:8)
附录接受的答案,了解为什么它不适用于您可以在javascript控制台中尝试的一些示例。
直接与未定义类型进行比较仅在变量存在时才有效。以下是您从Google Chrome浏览器中获得的输出:
> task === undefined
ReferenceError: task is not defined
但是,如果变量存在,它将起作用:
// continued from above
> var task
undefined
> task === undefined
true
这就是为什么你应该使用typeof
解决方案的原因,因为它可以在所有情况下工作,而不会抛出错误(并且会破坏javascript代码的执行)。
// continued from above
> typeof notavariable === 'undefined'
true
> typeof task === 'undefined'
true
请注意,在某些情况下您不需要typeof
检查,例如对象文字中的属性:
// continued from above
> var obj = {}
undefined
> obj.test === undefined
true
> obj.test = 1
1
> obj.test === undefined
false
这是因为对象中的属性更像是关联数组中的值:
// continued from above
> obj["test"]
1
> obj["test"] === undefined
false
但是,您无法始终确定这是一个无法控制参数输入的函数中的情况:
// continued from above
> function TestFunc(arg1) { console.log(arg1) }
undefined
> TestFunc(notavariable)
ReferenceError: notavariable is not defined
> TestFunc(task)
undefined
undefined
> TestFunc(obj["lol"])
undefined
undefined
希望这个练习可以帮助你理解这种比较的原因。