【问题标题】:In the following javascript function what does the || operator do? [duplicate]在以下 javascript 函数中 ||运营商呢? [复制]
【发布时间】:2011-07-07 21:23:29
【问题描述】:

取自 box2djs 示例。

我正在尝试理解图书馆,但我不明白这一行:

    ballSd.radius = rad || 10;

这是什么意思?

这是完整的定义

createBall2 = function(world, x, y, rad, fixed) {
    var ballSd = new b2CircleDef();
    if (!fixed) ballSd.density = 1.0;

    // what does the next line do?
    ballSd.radius = rad || 10;

    ballSd.restitution = 0.2;
    var ballBd = new b2BodyDef();
    ballBd.AddShape(ballSd);
    ballBd.position.Set(x,y);
    return world.CreateBody(ballBd);
};

【问题讨论】:

    标签: javascript box2d


    【解决方案1】:

    JavaScript 中的布尔表达式不返回 falsetrue,而是确定表达式结果的第一个操作数(从左到右)。

    当使用逻辑 OR || 时,这是第一个计算结果为 true 的操作数(类似于 && 计算结果为 false 的第一个操作数)。

    正如其他人已经指出的那样,如果 rad 的计算结果为 false(例如,如果它是 0),则返回第二个操作数。

    这个“技巧”通常用于设置默认值。

    Read more about logical operators.


    †:那只有 66.6% 的正确率。 NOT 运算符! 将始终返回一个布尔值。

    【讨论】:

    • 决定结果的不是从左到右的第一个操作数。在 OP 的示例中,第一个操作数可以是字符串,但如果它不是“falsy”,则表达式返回一个数字。它是导致返回短路比较的操作数。如果没有操作数使比较短路,则返回最后一个操作数。 ! 在这里并不重要,因为它是一元运算符。
    • @Juan Mendes:我想说这是一样的。不知道您想通过字符串示例告诉我什么。当然,如果rad 是一个空字符串,它并不能确定结果。 10 被返回。如果它不是一个空字符串,那么它将被返回。请注意,如果它是 0,我写了 eg。如果返回最后一个操作数,那么它是第一个确定结果的操作数,因为之前的所有操作数都没有。
    • 现在我明白你的意思了。我很困惑,因为您的第一句话模棱两可,请再读一遍……“决定表达式结果的第一个操作数(从左到右)。”如果它说类似“使比较短路的第一个操作数(从左到右)决定表达式的结果”之类的话会更清楚。
    • @Juan Mendes:嗯。我可以随心所欲地阅读,我无法以任何其他方式理解它;)但是你有道理,这也是因为短路评估。
    【解决方案2】:

    所有答案都是正确的,但它们缺少对 JavaScript 中 &&|| 运算符的解释。诀窍是它们不返回布尔值,它们返回比较短路的值。

    例如

    // Returns the first truthy value (2) since after looking at 0 and 2, we already
    // know the expression is true and we don't need to evaluate the last component (3)
    alert (0 || 2 || 3) 
    
    // Returns the first falsy value (""), the comparison doesn't even
    // evaluate "Hello" and "Dog"
    alert( "" && "Hello" &&  "Dog" );
    
    // No short circuiting, so the last value ("fun") is returned
    alert( "string" && "fun" )
    

    【讨论】:

      【解决方案3】:

      this...所以如果rad变量转换为布尔值的值为true,则返回rad,否则返回10; 任何变量都可以转换为布尔值: null, 0, undefined 将被转换为false; not undefined 将被转换为 true; 见implicit boolean conversions in javascript

      【讨论】:

        【解决方案4】:

        如果给定参数“rad”,则将圆半径设置为给定参数“rad”,否则将其设置为大于零的 10,这使其成为默认半径。

        【讨论】:

          【解决方案5】:

          如果 rad 为 false 或 0,则将 ballSd.radius 设置为 10

          【讨论】:

            【解决方案6】:
            ballSd.radius = rad || 10; 
            

            表示:如果rad == true(或truthy)返回rad值,否则返回10

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-26
              • 2010-10-24
              • 1970-01-01
              • 1970-01-01
              • 2023-03-04
              • 2023-01-24
              • 2021-12-01
              • 1970-01-01
              相关资源
              最近更新 更多