如何在不获取参考错误的情况下将不存在的JavaScript对象与undefined进行比较?

时间:2012-07-08 02:43:08

标签: javascript referenceerror

我想布尔来出这个表达式

(task === undefined);

其中task是任意的,根本不会出现在代码中。

然而,当我在rhino中运行它时,我得到一个引用错误。我想要

为什么我不成真?

我想检查是否已定义特定变量。如果这不起作用,我该怎么办呢?

2 个答案:

答案 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

希望这个练习可以帮助你理解这种比较的原因。