我想从这个表达式中出来布尔值
(task === undefined);
wheretask
是任意的,根本不会出现在代码中。
但是,当我在 rhino 中运行它时,我得到一个参考错误。我想要真实的
为什么我不说真话?
我想检查是否已定义特定变量。如果这不起作用,我该怎么做?
我想从这个表达式中出来布尔值
(task === undefined);
wheretask
是任意的,根本不会出现在代码中。
但是,当我在 rhino 中运行它时,我得到一个参考错误。我想要真实的
为什么我不说真话?
我想检查是否已定义特定变量。如果这不起作用,我该怎么做?
用这个:
(typeof task === "undefined")
使用时(task === undefined)
,Javascript需要查找的值,task
看是否与 相同undefined
,但是因为不存在而无法查找名称,给你引用错误。 typeof
特殊之处在于它可以安全地返回不存在的名称类型。
已接受答案的附录,以了解为什么它不适用于您可以在 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
希望这个练习可以帮助你理解这种比较的原因。