首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript:条件(三元)与非布尔值的布尔或?

JavaScript:条件(三元)与非布尔值的布尔或?
EN

Stack Overflow用户
提问于 2011-04-28 19:04:12
回答 4查看 4.3K关注 0票数 4

在JavaScript中,对于所有类型的变量(例如字符串、函数等),我可以始终使用布尔OR而不是条件运算符吗?

例如,用z = (x || y)代替z = (x ? x : y)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-28 19:13:11

它们是相似的,但并不完全相同。如果选择了xx ? x : y最终会对x求值两次。如果x是一个函数调用,这可能会导致意外的效果。

您可以在ECMA specification中找到这方面的正式证明。

证明这一点的另一种方法:

代码语言:javascript
运行
复制
function a() { c++; return true; }
function b() { d++; return true; }
var c = 0, d = 0;
a() || 3;
b() ? b() : 3;
/* c is 1; d is 2 */
票数 8
EN

Stack Overflow用户

发布于 2011-04-28 19:12:55

ECMAScript language specification,第83页:

生产LogicalORExpression : LogicalORExpression || LogicalANDExpression评估如下:

  1. 让lref成为LogicalORExpression求值的结果。将lval设为GetValue(lref)。
  2. 如果ToBoolean( lval )为true,则返回lval。
  3. 让rref成为评估LogicalANDExpression的结果。
  4. Return GetValue(rref).

因此,||返回变量的值,而不是运算的布尔结果。该值由if (...)语句转换为布尔值。

票数 2
EN

Stack Overflow用户

发布于 2011-04-28 19:29:37

这两个表达式在javascript中是等价的,因为逻辑" or“运算符如果为"true”,则返回第一个元素,否则返回第二个元素。

但是,您应该注意哪些值是真的,哪些值被认为是假的,因为这与其他动态类型语言不同……例如,对于Javascript和Python,""0都为false,但对于Python,[]为false,而对于Javascript,则为true。相反,在Common Lisp中,所有内容都被认为是“真”(包括0""或空数组),唯一的例外是NIL被认为是假的(NIL也是“空列表”)。

非常有用的是,Javascript认为undefined是“假”的,因为这允许编写像obj.redraw && obj.redraw();这样的代码,这些代码只在redraw方法存在时才调用它,否则什么也不做(一个函数/方法对于Javascript来说是“真”)。

如果使用xy,您并不是指实际的变量,而是指表达式,那么这两者是不等价的,因为“三元运算符”版本中的x将被计算两次(如果第一次计算时为"true“),而在”逻辑或“版本中只会被计算一次。如果x是一个函数调用,这一点会有所不同。

如果你想强制一个值成为Javascript的布尔结果,最常见的习惯用法可能是!!x,它总是truefalse

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5817578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档