在JavaScript中,对于所有类型的变量(例如字符串、函数等),我可以始终使用布尔OR而不是条件运算符吗?
例如,用z = (x || y)代替z = (x ? x : y)。
发布于 2011-04-28 19:13:11
它们是相似的,但并不完全相同。如果选择了x,x ? x : y最终会对x求值两次。如果x是一个函数调用,这可能会导致意外的效果。
您可以在ECMA specification中找到这方面的正式证明。
证明这一点的另一种方法:
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 */发布于 2011-04-28 19:12:55
ECMAScript language specification,第83页:
生产LogicalORExpression : LogicalORExpression || LogicalANDExpression评估如下:
因此,||返回变量的值,而不是运算的布尔结果。该值由if (...)语句转换为布尔值。
发布于 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来说是“真”)。
如果使用x或y,您并不是指实际的变量,而是指表达式,那么这两者是不等价的,因为“三元运算符”版本中的x将被计算两次(如果第一次计算时为"true“),而在”逻辑或“版本中只会被计算一次。如果x是一个函数调用,这一点会有所不同。
如果你想强制一个值成为Javascript的布尔结果,最常见的习惯用法可能是!!x,它总是true或false。
https://stackoverflow.com/questions/5817578
复制相似问题