在以下 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 中的布尔表达式不返回 false
或 true
†,而是确定表达式结果的第一个操作数(从左到右)。
当使用逻辑 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 函数中 ||运营商呢? [复制]的主要内容,如果未能解决你的问题,请参考以下文章