代码之家  ›  专栏  ›  技术社区  ›  Sparw

JavaScript条件返回[duplicate]

  •  0
  • Sparw  · 技术社区  · 6 年前

    我知道在JavaScript中您可以:

    var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
    

    变量在哪里 oneOrTheOther 如果第一个表达式的值不是 null , undefined ,或 false . 在这种情况下,它被赋给第二条语句的值。

    但是,变量 一个或另一个 当我们使用逻辑“与”运算符时,是否分配给?

    var oneOrTheOther = someOtherVar && "some string";
    

    什么时候会发生 someOtherVar 是非假的吗?
    什么时候会发生 其他人 是假的吗?

    刚刚学习了JavaScript,我很好奇赋值和and运算符结合会发生什么。

    0 回复  |  直到 9 年前
        1
  •  90
  •   Christian C. Salvadó    14 年前

    基本上,逻辑与运算符( && ),将返回第二个操作数的值(如果第一个是 真实的 ,如果第一个操作数本身是,它将返回第一个操作数的值 法尔西 ,例如:

    true && "foo"; // "foo"
    NaN && "anything"; // NaN
    0 && "anything";   // 0
    

    请注意 法尔西 价值观是那些强迫 false 在布尔上下文中使用时,它们是 null , undefined , 0 , NaN ,一个空字符串,当然 ,还有什么强迫 true .

        2
  •  30
  •   mykhal    14 年前

    && 有时被称为 警卫 接线员。

    variable = indicator && value
    

    仅当指示器为真时,才可用于设置值。

        3
  •  18
  •   Daniel Vassallo    14 年前

    引用 Douglas Crockford 1 :

    这个 && 如果第一个操作数为假,则运算符生成其第一个操作数的值。否则,它将生成第二个操作数的值。


    1 道格拉斯·克罗克福德: JavaScript: The Good Parts -第16页

        4
  •  17
  •   King Friday    7 年前

    初学者示例

    如果您试图访问“用户名“但后来发生了:

    Uncaught TypeError: Cannot read property 'name' of undefined 
    

    不要害怕。你可以用 &&操作人员 在作业中或经常被称为 保安员 因为它“保护”了未定义错误的发生。

    这里有一些例子,你可能会发现奇怪,但请继续阅读,因为它将在后面解释。

    var user = undefined;
    var username = user && user.username;
    // no error, "username" assigned value of "user" which is undefined
    
    user = { username: 'Johnny' };
    username = user && user.username;
    // no error, "username" assigned 'Johnny'
    
    user = { };
    username = user && user.username;
    // no error, "username" assigned value of "username" which is undefined
    

    解释 :在保护操作中,对每个术语进行评估 从左到右一次一个 . 如果计算的值是错误的,则停止计算,然后分配该值。如果到达了最后一个项目,那么它将被指定为是否错误。

    法尔西 意味着它是这些值中的任何一个 undefined, false, 0, null, NaN, '' 真实的 只是不代表falsy。

    简易防护按钮

    使用lodash的漂亮的guard操作符访问嵌套数据,如下所示:

    // need to access obj.has.some.very.nested.stuff
    var val = _.get(obj, 'has.some.very.nested.stuff');
    

    因为它可以方便地处理引擎盖下的东西。 Lodash _.get source code

    奖励:OR运算符

    另一个实用的奇怪的任务是 或运算符 通常用于以下插件:

    this.myWidget = this.myWidget || (function() {
       // define widget
    })();
    

    它只会分配代码部分,如果“这个.myWidget“是法尔西。这很方便,因为您可以在任何地方多次声明代码,而不必关心它以前是否被分配过,因为使用插件的人可能会多次意外地声明您的脚本标记src。

    解释 :每个值从 从左到右,一次一个 . 如果一个值是真的,它将停止计算并分配该值,否则,它将继续运行,如果到达最后一项,它将被分配,而不管它是否是假的。

    额外学分:在作业中结合&和| |

    你现在拥有了终极的力量,可以做一些非常奇怪的事情,比如在回文中使用它的这个非常奇怪的例子。

    function palindrome(s,i) {
     return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
    }
    

    在此进行深入解释: Palindrome check in Javascript

    快乐的编码。

        5
  •  2
  •   BatScream    10 年前

    根据 Annotated ECMAScript 5.1 section 11.11 :

    如果是逻辑或运算符(| |),

    expr1 | | expr2如果可以转换为true,则返回expr1; 否则,返回expr2。因此,当与布尔值一起使用时|| 如果其中一个操作数为true,则返回true;如果两个操作数都为false,则返回true 假的。

    在给定的例子中,

    var oneOrTheOther=someOtherVar | |“这些不是你要找的机器人……向前走”;

    如果Boolean(someOtherVar)为true,则结果将是someOtherVar的值 (请参考。 Truthiness of an expression ). 如果它是假的结果将是“这些不是你要找的机器人…向前走”;

    对于逻辑And运算符(&),

    如果expr1可以转换为false,则返回expr1;否则,返回 表达式2。因此,当与布尔值一起使用时,如果两者都是,则返回true 操作数为true;否则返回false。

    在给定的例子中,

    案例1:当Boolean(someOtherVar)为false时:它返回someOtherVar的值。

    案例2:当Boolean(someOtherVar)为真时:它返回“这些不是你要找的机器人…继续前进”。

        6
  •  0
  •   Drew Deal    7 年前

    我在工作中看到过多地用在分配报表上。问题有两个方面: 1) “指示符”检查有时是开发人员不考虑的开销函数。 2) 开发人员很容易将其视为一种安全检查,而不认为他们正在为其var赋值false。我希望他们有一种类型安全的态度,因此我让他们改变这一点:

    var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

    对此:

    var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

    所以他们得到了一个预期的整数。