我有这个:
modalTogglePreview: function ($scope) {
if ($scope.modal.wmdPreview === true) {
$scope.modal.wmdPreview = false;
} else {
$scope.modal.wmdPreview = true;
}
}
有没有什么方法可以实现相同但没有if语句?
答案 0 :(得分:12)
$scope.modal.wmdPreview = !$scope.modal.wmdPreview;
一元!
运算符将其参数解释为boolean,并返回布尔补码。请注意,这与完全与您的代码完全相同:只有在测试时变量完全 true
时才会起作用。根据我的经验(对于那些值得的东西),依赖于在JavaScript中用作标志的变量是真正的布尔值有点脆弱。 (但有反驳论据,所以取决于你。)
要进一步说明,!
运算符会解释值undefined
,null
,0
,NaN
,false
以及空字符串""
为false
。任何其他值均为true
。
答案 1 :(得分:1)
除了使用Pointy提到的not运算符(这应该是首选方法)之外,如果你发现自己在if...else
语句中设置了一个布尔值,那么你可能做错了。
条件已经计算为布尔值。所以你的if...else
陈述等同于
$scope.modal.wmdPreview = $scope.modal.wmdPreview !== true;
看看这些例子:
var result;
if (cond) {
result = true;
}
else {
result = false;
}
这意味着,如果条件(cond
)为真,请将result
设置为true
。如果cond
为false,请将结果设置为false
。我们分配给result
的值恰好是cond
的值。因此,上述内容相当于写作
var result = cond;
现在,有时我们使用不评估为布尔值的条件。要将任何值转换为其布尔等效值,可以应用not运算符两次:
var result = !!cond;
相反的方式相似:
var result;
if (cond) {
result = false;
}
else {
result = true;
}
如果cond
为真,请将false
分配给result
。如果cond
为false,请将true
分配给result
。这和你的情况一样。我们分配给result
的值与cond
的值相反。正如Pointy所示,我们可以使用not运算符:
var result = !cond;
这适用于所有条件,但根据表达式,它可能使其更难阅读。例如,!(x > 5)
并不像x <= 5
那么明显。因此,如果您发现自己处于这种情况,通常可以翻转比较运算符。