【问题标题】:I want to know if the two JavaScript snippets are the same or not我想知道这两个 JavaScript 片段是否相同
【发布时间】:2012-12-06 10:05:24
【问题描述】:

我是 JavaScript 新手,我想了解更多。

例如:

a == true && alert("a is true");

这是否类似于:

if(a == true)
{
    alert("a is true");
}

如果上面的代码是正确的并且它们都相等,那么我想知道所有这样的运算符和条件。我在哪里可以找到它们?

【问题讨论】:

  • 你能从下面选择正确的答案吗?所以这会帮助别人。 :P
  • @Parag - 请给 OP 一些时间 .. 这个问题刚问了半个小时。慢慢来,RG,只有当它真的对你有帮助时才接受答案。
  • @Marijn 是的,你是对的 :)。我之所以发表评论,是因为我认为该用户是 stackoverflow 的新手,所以只是为了通知他。 :p

标签: javascript coding-style


【解决方案1】:

答案:结果,即警告框,将是相同的。

解释:

大多数语言设计为仅在第一个表达式评估为 true 时才评估第二个表达式,以防&& 表达式。

这意味着如果 a 的计算结果为 falsenullundefined、一个空字符串、0NaNalert("a is true") 将不会被计算,你将不会看不到警告框。

JavaScript 的值可以是“真”或“假”,我建议您在此处阅读更多相关信息:http://11heavens.com/falsy-and-truthy-in-javascript

所以,这取决于你对“相同”的定义,结果,即看到或没有看到警告框,是相同的。


如果您想了解更多关于 JavaScript 中不同运算符及其工作原理的信息,请查看:developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators

【讨论】:

  • 如果a 评估为nullundefined,它也不会评估警报。您可能想在回答中澄清这一点。
  • OP 询问了 a == true && alert("a is true");但是您正在解释一个 && alert("a is true");这些是不同的,我认为 OP 并不明确。
  • 不,@SergeyS。不要这样迂腐。毕竟,通过强制,a && alert() a == true && alert() 相同。
  • @SergeyS,我看不出拒绝投票的理由。另外,我正在解释 OP 询问的内容。如果 a 对我列出的任何内容进行评估,则 a == true 将评估为 false。
【解决方案2】:

两者的唯一区别是这是一个表达式:

a == true && alert("a is true");

但这是一个声明:

if (a == true) {
    alert('a is true');
}

表达式的结果取决于a == true 的计算结果。

false && alert('a is true'); // false (and alert box does not show up)
true && alert('a is true');  // undefined (after alert box is clicked away)

这要归功于评估表达式的“短路”行为;使用&&,第一个错误的条件将成为表达式的结果,而不计算其余条件。

另一个具有类似行为的运算符是逻辑运算符||。考虑:

a || alert('a is false');

如果a 计算结果为假,则会显示警报框。

false || alert('a is false'); // undefined (after alert box is clicked away)
true || alert('a is false');  // true (alert box does not show up)

请注意,具有此类副作用的表达式被认为是“聪明”的解决方案;它们可能会缩短您的代码,但最初的意图并不总是显而易见的。

也就是说,它也有很好的用途,例如:

a = a || 'default value';

如果a 是虚假的,这将分配一个默认值,否则将分配a 的原始值。您可以经常看到这些表达方式,它们是该语言的一项强大功能。

【讨论】:

    【解决方案3】:

    这不是 Javascript 的特殊语法 - 它只是缩短代码的技巧。

    没有魔法。这只是一个简单的逻辑。通常,代码最小化器使用这些技巧来缩短代码。此行为基于 && 和 ||运算符的重要属性 - 如果从第一部分知道结果,它们不会计算表达式的第二部分(与 & 和 | 运算符相反,它们总是计算表达式的两个部分)。

    用法说明:

    a==true && alert("a is true");
    

    如果 'a' 为假 - javascript 引擎分析整个表达式也必须为假(因为 '&&' (AND) 逻辑运算符的含义) - 它省略了表达式的第二部分,因为无论它返回什么结果它不会改变整个表达式的结果。所以它不会运行“警报”。相反,如果“a”为真 - Javascript 引擎需要知道表达式第二部分的结果并且它运行“警报”。这种行为模仿了通常的“if”语句。

    a==false || alert("a is true");
    

    这是使用“或”逻辑运算符。如果“a”为假,则无需评估表达式的第二部分并触发“警报”。如果“a”为真,则表达式的第二部分有可能为“真”并且整个表达式的计算结果为“真”——因此 javascript 引擎运行“警报”。

    此外,这些快捷方式可以进一步缩短。因为不需要比较两个布尔值:'a'和'true',因为'a'已经是布尔值。它使以下内容:

    a && alert("a is true");
    

    基本上你不需要手动使用这些东西,只需要使用普通的“if”语句——它会让你的代码可读。然后,如有必要,您可以使用代码最小化器来缩短生产代码。

    编码愉快!

    【讨论】:

      【解决方案4】:

      在其他答案中有很多很好的例子,&& 的工作原理,所以我不会重复它们。总之……

      当计算表达式时,它会发送一个返回值作为结果。在您的特定情况下(第一个示例),返回值不在任何地方使用,结果与第二个示例相同。但是如果我们使用那个返回值,比如说在if 条件下,我们可能会得到一些令人困惑的结果。这是一个例子:

      var a = true;
      if (a == true && alert('a = true')) {
          alert('a really is true');
      } else {
          alert('It seems, that a is not true');
      }
      

      此代码n-p 将首先警告“a = true”,第二个警告将是“似乎,a 不正确”。这是由于DOM原生函数alert()的返回值,它返回undefined,这使得条件为假(true && undefined === false)。因此,我们可以说,您的 coden-ps 在该特定上下文中是相等的,但在其他某些上下文中则不同。

      【讨论】:

        【解决方案5】:

        他们都做同样的事情。这取决于您喜欢代码的外观,大多数人(我认为)会同意第二个版本最好阅读。

        If 语句在遇到错误时停止执行(在 && 运算符的情况下),因此第一条语句说“如果 a 为真,则如果警报...”,这意味着如果 a 为真,则将显示警报。

        这与第二版的结果完全相同。

        【讨论】:

        • "If statements 在遇到 false 时停止执行..." 这仅适用于 && 表达式。
        • @Yannbane 正确 - 感谢您指出我的失职 - 已修改 :)
        【解决方案6】:

        两组代码产生相同的结果但不一样

        对于第一个代码集,

        a == true && alert("a is true")
        

        使用了logical operator &&

        在使用 && 评估语句时,false && anything 的短路评估为 false。

        因此,如果a 为假,则不会在第一条语句中调用alert(1)。 js 编译器跳过alert 语句。

        如果a 为真,则执行alert(1),因为条件没有短路。

        在第二组中,使用正常的if 条件。检查这个link

        【讨论】:

          【解决方案7】:

          这段代码做同样的事情,检查a是否为真然后调用函数alert,我想我可以说是一样的。

          【讨论】:

          • 这是一个非常不精确的答案。
          • 好问题,只需要写很多 javascript 并查看 javascript 框架,检查其他代码 ;) 并有一点天赋 ;) gl & hf
          • @RGA 如果您想学习不同的编码风格,请自己寻找它们:) 我建议您同时研究面向对象和函数式风格的语言。 Javascript 非常适合函数式风格,因为函数是一流的对象。这两个语句相同的原因是,如果其中一个操作数为假(例如 a == true),则 && 快捷方式 - 因此其余部分不会被评估(例如 alert(...) 部分)。
          猜你喜欢
          • 1970-01-01
          • 2016-03-02
          • 2014-01-30
          • 1970-01-01
          • 1970-01-01
          • 2018-08-09
          • 2012-04-03
          • 2017-09-12
          • 1970-01-01
          相关资源
          最近更新 更多