41

我想从这个表达式中出来布尔值

(task === undefined);

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

但是,当我在 rhino 中运行它时,我得到一个参考错误。我想要真实的

为什么我不说真话?

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

4

2 回答 2

75

用这个:

(typeof task === "undefined")

使用时(task === undefined),Javascript需要查找的值,task看是否与 相同undefined,但是因为不存在而无法查找名称,给你引用错误。 typeof特殊之处在于它可以安全地返回不存在的名称类型。

于 2012-07-08T02:44:31.103 回答
11

已接受答案的附录,以了解为什么它不适用于您可以在 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

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

于 2012-10-23T09:34:32.597 回答