我无法理解这一点。
以下表达式使用OR运算符
var subCond1 = adj.getData('relationEnabled') == 'true' || adj.getData('unhideIfHidden') || adj.getData('hlFixed') == 'true';
我期待由于它是OR操作,它应该返回布尔值true / false,但我得到字符串' false'结果。
有人可以解释一下吗?
答案 0 :(得分:7)
是的,这只是JavaScript中||
的一个功能,而且是故意的。它不会返回一个布尔值(必然),它的工作方式如下:它评估左侧操作数,如果该操作数是 truthy ,则返回它;否则,它会评估并返回右侧操作数。
那是什么" truthy"?任何不是" falsy"。 :-)虚假值为0
,""
,null
,undefined
,NaN
,当然还有false
。其他任何事都是真的。
如果需要布尔值,只需!!
结果:
var subCond1 = !!(adj.getData('relationEnabled') == 'true' || adj.getData('unhideIfHidden') || adj.getData('hlFixed') == 'true');
...但你经常不需要打扰。
||
的这种行为非常有用,特别是(我发现)在处理可能是null
的对象引用时,如果要提供默认值:
var obj = thisMayBeNull || {};
现在,obj
如果它是真实的(非thisMayBeNull
对象引用是真实的),则null
将是{}
,如果是thisMayBeNull
,则为&&
是假的。
我的博客上的这篇文章中有更多内容:JavaScript's Curiously-Powerful OR Operator (||
)
只是为了解决问题:null
运算符具有类似的行为:它评估左手操作数,如果它 falsy ,则返回它;否则它会评估并返回右手操作员。如果您想要一个可能是var value = obj && obj.property;
的变量的对象属性:
value
如果obj
falsy (例如,obj
),或{null
的值,则{p> obj.property
将是obj
的值1}}如果{{1}}是真实的。
答案 1 :(得分:1)
Javascript返回第一个具有truthy值的操作数,无论该truthy值是什么,或者如果之前没有任何值,则返回最后一个操作数的值。这是Javascript的设计特性(是的,它与其他语言不同)。
您可以通过比较将其转换为布尔值,如果您愿意,可以将其变为== true
,或者有时使用!!
完成。