在JavaScript中,我是否可以对所有类型的变量(例如字符串,函数......)使用布尔OR而不是条件运算符?
例如z = (x || y)
代替z = (x ? x : y)
。
答案 0 :(得分:7)
它们相似,但不完全相同。如果选择x ? x : y
,x
最终会评估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 */
答案 1 :(得分:2)
ECMAScript language specification,第83页:
生产LogicalORExpression:LogicalORExpression || LogicalANDExpression的评估如下:
- 让lref成为评估LogicalORExpression的结果。
- 让lval成为GetValue(lref)。
- 如果ToBoolean(lval)为true,则返回lval。
- 让rref成为评估LogicalANDExpression的结果。
- 返回GetValue(rref)。
醇>
所以||返回变量的值,而不是操作的布尔结果。该值由if (...)
语句转换为布尔值。
答案 2 :(得分:1)
这两个表达式在javascript中是等价的,因为逻辑“or”运算符返回第一个元素,如果它是“true”,否则返回第二个元素。
但是你应该注意哪些值是真的,哪些值被认为是假的,因为这与其他动态类型的语言不同...例如,对于Javascript和""
和0
都是假的Python,但[]
对于Python来说是假的,但对于Javascript来说却是如此。
在Common Lisp中,所有内容都被认为是“真实的”(包括0
或""
或空数组),唯一的例外是NIL被认为是假的(NIL也是“空列表”)。
非常有用的是,undefined
被Javascript视为“假”,因为这样可以编写obj.redraw && obj.redraw();
之类的代码,只有在redraw
方法存在并执行时才会调用x
方法否则没有(对于Javascript,函数/方法是“真实的”)。
如果使用y
或x
而不是实际变量而是表达式,则两者不等效,因为“三元运算符”版本中的x
将被评估两次(如果在第一次评估时为“true”,在“逻辑或”版本中只有一次。如果!!x
是函数调用,这会有所不同。
如果你想强制一个值为Javascript的布尔结果,最常见的习语可能是true
,总是false
或{{1}}。
答案 3 :(得分:-3)
取决于您要实现的目标。如果您正在处理字符串,例如(x || y)
转换为“如果字符串x不为空/空或字符串y不为空/空”则返回1 / true,而(x ? x : y)
转换为“ifstring x is not null / empty然后返回x否则(如果它为空/ null)返回y“。
所以第一种方法总是返回一个布尔值1/0或者是真/假,而第二种方法将返回一个2个变量的实际值。
话虽如此,如果你想在另一个if(z)
中使用结果(z),那么它们是等价的。