【问题标题】:obj == 'undefined' OR obj === 'undefined' OR obj == null OR ALLobj == 'undefined' 或 obj === 'undefined' 或 obj == null 或 ALL
【发布时间】:2013-10-08 17:06:05
【问题描述】:

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

通常我会检查(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 (typeof(obj) === 'undefined') {},否则你检查的是价值而不是对象的存在(如果这是你的意图)
  • @ZathrusWriter:不,这不是一个好方法。查看 OP 的最后一个代码示例。这是尝试使用该语法时出现的常见错误的一个示例。
  • 哪一个更好用于什么?你想做什么?

标签: javascript


【解决方案1】:

做吧

if (obj == null) {

这将检查null 和undefined。


对于困惑的投票者,使用== null 将同时检查null 和undefined,但不会检查其他“错误”值。

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

typeof foo === undefined     // common bug

foo === "undefined"          // common bug

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

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


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

  • undefined 可能已被重新定义

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


以下是那些不是很好的理由

  • 全局undefined 不能在现代浏览器中重新定义,所以这不是问题。即使它确实被重新定义了,那么有些东西是非常错误的,需要以任何一种方式进行修复。如果你隐藏问题,你将永远无法解决它。

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

  • 1234563使用不安全的typeof foo === "undefined" 语法。

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

【讨论】:

  • 对于这个答案,this jsFiddle 返回:“Uncaught ReferenceError: abc is not defined”
  • @ZathrusWriter:是的,那是因为您的 jsFiddle 有错误。错误消息旨在通知开发人员错误,以便可以修复它们。开发人员不会试图隐藏错误,他们会修复它们。
  • 为什么typeof foo === "undefined" 会不安全或被窃听?
  • @DavidFregoli:在我的回答中,我描述了尝试使用该语法时遇到的常见错误。在我作为 JavaScript 开发人员的这些年里,我从未真正见过有人重新定义 undefined,但我已经看到了很多很多我所描述的错误。所以因为它是一种容易出错的语法,所以最好避免它。 (更不用说它过于冗长和不直观。)
  • @user 错误会导致行为不稳定或不一致,这种语法可能会令人困惑,但如果您知道如何使用它,就没有任何问题
【解决方案2】:

您已经确定了四个测试:

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

其中,第一个和第三个行为相同。 (如果 obj 未定义,obj == null 将评估为 true。)* 第二个和第四个根本不做你想做的事,因为如果 obj 是字符串 'undefined'(以及obj 未定义时,这要归功于obj == null 的行为方式)。

至于是否需要对未定义进行测试,这取决于是否需要区分未定义值和空值。在大多数应用程序中,您不需要这样做。如果你确实需要这样做,你应该使用obj === null 和obj === undefined。

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

if (typeof obj === 'undefined')

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

*但是,如果 obj 未定义,obj === null 将评估为 false。

【讨论】:

    【解决方案3】:

    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) 检查是否为空

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

    【讨论】:

      【解决方案4】:

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

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

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

      如果您要检查 全局 变量,那么以下将使用typeof() 来完成的技巧(也适用于所有对象)。 .

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

      【讨论】:

      • 这不符合 OP 的要求。冗长而笨拙的语法是比它所谓的“避免”更多的错误的根源。总体而言,这是一种不好的做法。
      • @ZathrusWriter 我同意你关于对象存在的评论。但我认为 OP 正在检查分配的值。如果说var abc = null;,则此检查不起作用
      • @user2736012:真的吗? OP想要什么?
      • @KarolyHorvath:显然是为了测试null 或undefined。
      • 请注意,如果您在 Web Worker 中,也不会定义“窗口”。您可以使用 self.abc ...但 typeof(abc) === 'undefined' 在这两种情况下都可以使用。它还将涵盖其他环境,例如 node.js。
      猜你喜欢
      • 2016-06-22
      • 2023-04-02
      • 1970-01-01
      • 2012-04-25
      • 2012-11-20
      • 2013-05-11
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多