【问题标题】:what does && return in javascript expression&& 在 javascript 表达式中返回什么
【发布时间】:2014-06-25 07:47:03
【问题描述】:

我正在阅读一些应用程序中的 javascipt 代码,代码是这样的

getTotalFees:function(){
        return this.grid
        &&this.grid.getStore().sum('fees');
}

现在我很困惑它会返回什么。

在我看来它像

return a&&b

它不会返回 true 或 false 而不是 b

【问题讨论】:

  • 如果a 不是undefined 并且b 不是undefined,则返回b。
  • 该代码在功能上等同于if (this.grid) { return this.grid.getStore().sum('fees');}

标签: javascript


【解决方案1】:

逻辑与(&&):
expr1 && expr2如果可以转换为false则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,如果两个操作数都是 true,&& 将返回 true;否则,返回false。

Source

所以,基本上:
如果第一个参数是falsy,则返回该参数。否则,它实际上会返回第二个参数。

在您的情况下,这意味着如果 this.grid 存在,则返回 this.grid.getStore().sum('fees');

【讨论】:

  • 如果网格不存在将返回False 或this.grid 即undefined
  • 然后它将返回this.grid,即undefined ,一个falsy值。
  • 它甚至不会尝试调用this.grid.getStore().sum('fees');,从而避免错误
【解决方案2】:

这样做是为了防止在未定义的属性上调用方法,否则会导致错误。因此,如果this.grid 是undefined,则返回undefined。

在表达式中如果a && b 当a 等于false(或者在javascript 中它可以是Cerburs 答案中的表达式),则返回a。

与|| 运算符类似,返回左起第一个等于true(在javascript 中不是0,不是未定义,不是null,不是NaN,当然也不是false)。

【讨论】:

    【解决方案3】:

    你误解了&& 的作用。让a 和b 成为“实体”。然后a && b 会:

    1. 评估a
    2. 如果a 是假的,则返回a
    3. 如果a 是真的评估b
    4. 返回b

    例子:

    var f = function() {
        console.log("test");
        return 'foo';
    }
    
    > 0 && f()
    0
    > 1 && f()
    test
    "foo"
    

    请注意,在第一种情况下,我们没有得到console.log,因为f() 没有被评估,因为0 是假的。这个属性很重要,实际上

    a && b != b && a
    

    即使在数学上它应该是相同的(但这不是由于评估的副作用)。

    虚假值包括:0、false、""(空字符串)、null、undefined、NaN(不是数字类型)。我认为没有任何其他可能的值(如果我错了,请有人纠正我)。其他所有对象都是真实的。

    所以在你的情况下,代码可以重写为:

    if (this.grid) {
        return this.grid.getStore().sum('fees');
    } else {
        return this.grid;
    }
    

    【讨论】:

    • 3.如果a被定义为不真实,或者如果不是undefined则更好
    • @algorhythm "" && 2 === "" 虽然显然 "" 已定义。
    • "" 是假的,0 和 'false' 也是假的
    • @algorhythm 是的,这正是我所写的。空字符串是假的。
    • @Boris 是的,但不是undefined,我评论说“......,或者如果它不是未定义的更好”
    【解决方案4】:

    好的,假设this.grid.getStore().sum('fees') 返回了一些东西,让我们说“好的!”。

    现在代码中的 return 语句是一种复杂的说法:

    if(this.grid)//this.grid is defined and doesn't evaluate as 'false'
        return this.grid.getStore().sum('fees');
    else
        return this.grid;
    

    如果它没有网格,我们返回 undefined,否则我们调用 gridStore... 并返回它自己的返回值。 这是避免“undefined has no method 'gridStore'”的常用方法

    非常重要的部分是,在a && f() 中,如果 'a' 评估为 false,则不会调用 f()。有许多计算结果为假的东西,例如任何未定义的变量、null、空字符串......(请注意,包含虚假内容的字符串,如 "false" 或 "0000" 实际上是真实的)。甚至像function(){return null;}(); 这样难以理解的废话也可能被评估为假。

    【讨论】:

    • 其实这不是同一个代码。 if 语句应为 if (this.grid)。否则它会做不同的事情(如果 this.grid 是 0 怎么办?)。
    • 是的,你是对的,或者if(!!this.grid)。但我认为它会更容易理解。我会编辑
    猜你喜欢
    • 2018-09-26
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多