1

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

通常我会(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');
  }

哪个更好,我们真的需要检查 undefined吗?

4

4 回答 4

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应该被视为理想的警告,而不是隐藏的东西。

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


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

于 2013-10-08T17:07:25.973 回答
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 === nulland obj === undefined

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

if (typeof obj === 'undefined')

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

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

于 2013-10-08T17:46:24.803 回答
0

undefined是一个词,意思是not defined

null是一个对象

让我们看看这段代码

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

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

请注意,变量名称thing已声明,但未定义。所以在这种情况下thing === undefined就足够了,你不需要做更多的 verbose 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是一个对象。null当一个函数应该返回一个对象或数组,但在某些情况下应该告诉我们“找不到对象”(空对象的不同情况{}意味着:我找到了对象,它是空的)时, Javascript 核心使用。以方法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)

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

于 2013-10-09T00:15:59.983 回答
-1

如果您想检查有问题的对象是否存在并防止各种 JS 错误,请使用以下内容:

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

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

如果您要检查全局变量,那么以下内容将在使用的情况下完成typeof()(也适用于所有对象)...

if (!window.abc) {
  console.log('not defined');
}
于 2013-10-08T17:15:47.687 回答