obj =='undefined'或obj ==='undefined'或obj == null或ALL

时间:2013-10-08 17:06:06

标签: javascript

我总是不确定哪一个是正确的以及哪些是正确的。

通常我会(obj == null)检查。我觉得最好问一下。

我将使用以下哪一项:

  if (obj == null) {
        alert('obj is null');
  }

OR

  if (obj == null || obj == 'undefined') {
        alert('obj is null or undefined');
  }

OR

  if (obj == null || obj == undefined) {
        alert('obj is null or undefined');
  }

OR

  if (obj == null || obj === 'undefined') {
        alert('obj is null or undefined');
  }

哪一个更好,我们真的需要检查未定义吗?

4 个答案:

答案 0 :(得分:1)

只做

if (obj == null) {

这将检查nullundefined


对于困惑的下注者,使用== null会同时检查nullundefined,但没有其他“假名”值。

typeof foo === "undefined"语法实际上会导致比修复更多的错误。像这些......

typeof foo === undefined     // common bug

foo === "undefined"          // common bug

typeof foo === "undefnied"   // common bug

这些是非常常见的错误,并且是使用此语法的原因。


以下是初学者被告知使用该语法的案例......

  • undefined可能已被重新定义

  • 您的变量可能未声明,导致 ReferenceError


这些原因不是很好的原因

  • 无法在现代浏览器中重新定义全局undefined,因此这不是问题。即使它确实被重新定义,然后某些东西是非常错误的,并且需要以任何方式修复。如果你隐藏了这个问题,你就永远无法修复它。

  • 如果开发人员尝试使用未声明的本地变量,则表示代码中存在错误, ReferenceError 应视为< em>理想的警告,而不是隐藏的东西。

  • 如果开发人员试图使用事先无法知道的未声明的全局变量,那么检查变量作为window上的属性会更安全对象而不是使用不安全的typeof foo === "undefined"语法。


是的,nullundefined之间存在类型区别,因此需要进行检查。当类型不匹配时,==运算符执行类型强制算法。这就是为什么你可以使用== null来检查两者。

答案 1 :(得分:1)

您已经确定了四项测试:

if (obj == null)
if (obj == null || obj == 'undefined')
if (obj == null || obj == undefined)
if (obj == null || obj === 'undefined')

其中,第一个和第三个表现相同。 (obj == null如果true未定义,则obj将评估为obj。) * 第二个和第四个不执行您想要的任务,因为测试将成功如果'undefined'字符串 obj(以及未定义obj == null时,感谢obj === null的行为方式)。

至于是否需要测试undefined,这取决于您是否需要区分未定义的值和空值。在大多数应用程序中,您不需要这样做。如果您确实需要这样做,则应使用obj === undefinedif (typeof obj === 'undefined')

如果您需要防范未声明的变量,那么您可以使用:

obj === null

但除了最不寻常的情况外,您应该在给定的上下文中知道是否已声明变量。

* 但是,如果false未定义,obj将评估为{{1}}。

答案 2 :(得分:0)

undefined是一个单词,意思是not defined

null是一个对象

让我们看看这段代码

function saySomething(thing) {
    if(thing === undefined) {
        sayRandomThing();
    }else {
        sayThat(thing);
    }
}

在这种情况下,我会检查是否给出了参数,或者换句话说,是否定义了参数。

请注意,声明了变量名thing,但未对其进行定义。因此,在这种情况下thing === undefined就足够了,您不需要做更详细的typeof thing === "undefined"

没有理由使用null这个词。因为null是一个对象,它与我们的thing无关。

再说一遍。如果您不知道是否声明了变量,则需要typeof thing === "undefined"。但是,正如documentation say

  

但是,应该避免使用这种技术。 JavaScript是一种静态范围的语言,因此可以通过查看是否在封闭的上下文中定义来了解变量是否已定义。唯一的例外是全局范围,但全局范围绑定到全局对象,因此可以通过检查全局对象上是否存在属性来检查全局上下文中是否存在变量(使用in运算符,例如)

我应该何时使用null

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

  

在API中,通常会在可以预期对象但没有对象相关的位置检索null。

null是一个对象。当一个函数返回一个对象或一个数组时,Javascript核心使用null,但在某些情况下应该告诉我们“找不到对象”(空对象{}的不同情况意味着:我已经找到了这个对象,它是空的)。例如,方法match就属于这种情况。

var matches = "My awesome string".match("don't match anything");

console.log(matches === null); // true

在您的脚本中,您知道,作为开发人员,变量应该是什么类型。你应该知道应该使用哪种条件。记住:

  • 如果您不知道变量是否声明,请在进行其他检查之前使用if(typeof varName === "undefined")
  • 如果您不知道变量是否已定义,请在进行其他检查之前使用if(varName === undefined)
  • 如果您知道变量是否已定义且是对象,请使用if(varName === null)
  • 检查是否为null

需要严格相等运算符(===),因为varName == undefined还会检查varName是否为空

答案 3 :(得分:-1)

如果您想检查相关对象的存在并阻止各种JS erorrs,请使用以下内容:

if (typeof(abc) === 'undefined') {
    console.log('not defined');
}

jsFiddle证明有用性:http://jsfiddle.net/tJyfg/1/

如果您要查看全局变量,那么以下内容将使用typeof()执行不使用的技巧(适用于所有对象) ...

if (!window.abc) {
  console.log('not defined');
}