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

Faw*_*es5 31 javascript referenceerror

我想布尔表达出这个表达式

(task === undefined);
Run Code Online (Sandbox Code Playgroud)

where task是任意的,根本不出现在代码中.

但是,当我在rhino中运行它时,我得到一个引用错误.我想要的

为什么我没有成真?

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

Ned*_*der 64

用这个:

(typeof task === "undefined")
Run Code Online (Sandbox Code Playgroud)

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


Spo*_*ike 9

接受答案的附录,了解为什么它不适用于某些示例,您可以在javascript控制台中尝试自己.

直接与未定义类型进行比较仅在变量存在时才有效.以下是您从Google Chrome浏览器中获得的输出:

> task === undefined
  ReferenceError: task is not defined
Run Code Online (Sandbox Code Playgroud)

但是,如果变量存在,它将起作用:

// continued from above
> var task
  undefined
> task === undefined
  true
Run Code Online (Sandbox Code Playgroud)

这就是你应该使用typeof解决方案的原因,因为它可以在所有情况下工作而不会抛出错误(并打破javascript代码的执行).

// continued from above
> typeof notavariable === 'undefined'
  true
> typeof task === 'undefined'
  true
Run Code Online (Sandbox Code Playgroud)

请注意,typeof在某些情况下您不需要检查,例如对象文字中的属性:

// continued from above
> var obj = {}
  undefined
> obj.test === undefined
  true
> obj.test = 1
  1
> obj.test === undefined
  false
Run Code Online (Sandbox Code Playgroud)

这是因为对象中的属性更像是关联数组中的值:

// continued from above
> obj["test"]
  1
> obj["test"] === undefined
  false
Run Code Online (Sandbox Code Playgroud)

但是,您无法始终确定这是在您无法控制参数输入的函数中的情况:

// 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
Run Code Online (Sandbox Code Playgroud)

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