在以下 javascript 函数中 ||运营商呢? [复制]

Posted

技术标签:

【中文标题】在以下 javascript 函数中 ||运营商呢? [复制]【英文标题】:In the following javascript function what does the || operator do? [duplicate] 【发布时间】: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);
;

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在以下 javascript 函数中 ||运营商呢? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JavaScript中创建对象模式的演变(原型)

深入理解JavaScript中创建对象模式的演变(原型)

前端安全JavaScript防流量劫持

轻松学习 JavaScript——第 5 部分:简化函数提升

APP如何运营呢?

JavaScript中==和===之间的区别[重复]