什么构造x = x

我正在调试一些JavaScript,并且无法解释这个|| 呢?

function (title, msg) {
  var title = title || 'Error';
  var msg   = msg || 'Error on Request';
}

有人可以给我一个提示,为什么这个人正在使用var title = title || 'ERROR' var title = title || 'ERROR' ? 我有时也会在没有var声明的情况下看到它。


这意味着title参数是可选的。 所以如果你调用没有参数的方法,它将使用默认值"Error"

这是写作的简写:

if (!title) {
  title = "Error";
}

这种布尔表达式的简写技巧在Perl中也很常见。 用表达式:

a OR b

它的计算结果为true如果任abtrue 。 所以如果a是真的,你根本不需要检查b 。 这被称为短路布尔评估,因此:

var title = title || "Error";

基本上检查title评估是否为false 。 如果是,则“返回” "Error" ,否则返回title


什么是双管操作符( || )?

双管道运算符( || )是逻辑OR运算符 。 在大多数语言中,它的工作原理如下:

  • 如果第一个值为false ,它会检查第二个值。 如果为true ,则返回true ,如果为false ,则返回false
  • 如果第一个值为true ,则无论第二个值是什么,它总是返回true
  • 所以基本上它像这个函数一样工作:

    function or(x, y) {
      if (x) {
        return true;
      } else if (y) {
        return true;
      } else {
        return false;
      }
    }
    

    如果你还不明白,看看这张表:

          | true   false  
    ------+---------------
    true  | true   true   
    false | true   false  
    

    换句话说,只有两个值都是假的,它才是错误的。

    在JavaScript中它有什么不同?

    JavaScript有点不同,因为它是一种松散类型的语言 。 在这种情况下,这意味着您可以使用|| 运算符的值不是布尔值。 虽然没有任何意义,但您可以使用此运算符,例如函数和对象:

    (function(){}) || {}
    

    那里会发生什么?

    如果值不是布尔值,则JavaScript将隐式对话转换为布尔值 。 这意味着如果该值为falsey(例如0""nullundefined (另请参阅JavaScript中的所有falsey值)),它将被视为false ; 否则视为true

    所以上面的例子应该是true ,因为空函数是真实的。 那么,它不会。 它返回空函数。 这是因为JavaScript的|| 操作员不像我在开始时写的那样工作。 它的工作原理如下:

  • 如果第一个值为falsey ,则返回第二个值
  • 如果第一个值是truthy ,它将返回第一个值
  • 惊讶吗? 其实,这是“兼容”与传统|| 运营商。 它可以写成以下函数:

    function or(x, y) {
      if (x) {
        return x;
      } else {
        return y;
      }
    }
    

    如果你传递一个真值作为x ,它返回x ,即真值。 所以如果你稍后在if子句中使用它:

    (function(x, y) {
      var eitherXorY = x || y;
      if (eitherXorY) {
        console.log("Either x or y is truthy.");
      } else {
        console.log("Neither x nor y is truthy");
      }
    }(true/*, undefined*/));
    

    你会得到"Either x or y is truthy."

    如果x是虚假的, eitherXorY就是y 。 在这种情况下,你会得到"Either x or y is truthy." 如果y真的是真的; 否则你会得到"Neither x nor y is truthy"

    实际的问题

    现在,当你知道如何|| 运营商的工作,你可以自己做出什么x = x || y x = x || y意思是 如果x是真的, x被分配给x ,所以实际上什么也没有发生; 否则y被分配给x 。 它通常用于在函数中定义默认参数。 但是,它通常被认为是一种糟糕的编程习惯 ,因为它会阻止您将错误的值(不一定是undefinednull )作为参数传递。 考虑下面的例子:

    function badFunction(/* boolean */flagA) {
      flagA = flagA || true;
      console.log("flagA is set to " + (flagA ? "true" : "false"));
    }
    

    它看起来很有效。 然而,如果你传递false作为flagA参数会发生什么(因为它是布尔型的,即可以是truefalse )? 这将成为true 在这个例子中,没有办法将flagA设置为false

    明确检查flagA是否undefined将是一个更好的主意,如下所示:

    function goodFunction(/* boolean */flagA) {
      flagA = typeof flagA !== "undefined" ? flagA : true;
      console.log("flagA is set to " + (flagA ? "true" : "false"));
    }
    

    虽然时间更长,但它始终有效,而且更容易理解。


    你也可以使用默认函数参数的ES6语法,但请注意,它在旧版浏览器(如IE)中不起作用。 如果你想支持这些浏览器,你应该使用Babel来编译你的代码。

    另请参阅MDN上的逻辑运算符。


    如果标题未设置,请使用'ERROR'作为默认值。

    更通用的:

    var foobar = foo || default;
    

    读取:将foobar设置为foodefault 。 你甚至可以多次连锁:

    var foobar = foo || bar || something || 42;
    
    链接地址: http://www.djcxy.com/p/52187.html

    上一篇: What does the construct x = x

    下一篇: Render React element from object value