obj == 'undefined' OR obj === 'undefined' OR

obj == 'undefined' OR obj === 'undefined' OR obj == null OR ALL

本文关键字:OR undefined obj      更新时间:2023-09-26

我总是不确定哪个是正确的,使用哪个。

通常我会(obj == null)检查。我想最好只是问。

我应该使用以下哪一项:

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

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

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

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

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

只是做

if (obj == null) {

这将检查nullundefined


对于困惑的反对者,使用== null将同时检查nullundefined,但没有其他"错误"值。

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

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

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


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

  • undefined可能已被重新定义

  • 您的变量可能未声明,从而导致引用错误


以下是这些不是很好的理由的原因

  • 全局undefined无法在现代浏览器中重新定义,因此这不是问题。即使它确实被重新定义,那么有些事情也非常错误,需要以任何一种方式进行修复。如果您隐藏问题,您将永远无法修复它。

  • 如果开发人员尝试使用未声明的局部变量,则意味着代码中存在错误,并且 ReferenceError 应被视为理想的警告,而不是要隐藏的内容。

  • 如果开发人员尝试使用事先无法知道的未声明的全局变量,则检查该变量是否为window对象的属性比使用不安全的typeof foo === "undefined"语法更安全。


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

您已经确定了四个测试:

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 === nullobj === undefined .

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

if (typeof obj === 'undefined')

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

*但是,obj === null将评估为false是否定义obj

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"。但是,正如文档所说:

但是,应避免使用这种技术。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是否为空varName == undefined

如果要检查相关对象是否存在并防止各种 JS 错误,请使用以下内容:

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

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

如果你想检查一个全局变量,那么以下内容将在不使用typeof()的情况下完成这个技巧(也适用于所有对象(......

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