有没有一种简单的方法可以在true和false之间切换javascript变量?

时间:2014-02-01 14:08:42

标签: javascript

我有这个:

    modalTogglePreview: function ($scope) {
        if ($scope.modal.wmdPreview === true) {
            $scope.modal.wmdPreview = false;
        } else {
            $scope.modal.wmdPreview = true;
        }
    }

有没有什么方法可以实现相同但没有if语句?

2 个答案:

答案 0 :(得分:12)

$scope.modal.wmdPreview = !$scope.modal.wmdPreview;

一元!运算符将其参数解释为boolean,并返回布尔补码。请注意,这与完全与您的代码完全相同:只有在测试时变量完全 true时才会起作用。根据我的经验(对于那些值得的东西),依赖于在JavaScript中用作标志的变量是真正的布尔值有点脆弱。 (但有反驳论据,所以取决于你。)

要进一步说明,!运算符会解释值undefinednull0NaNfalse以及空字符串""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那么明显。因此,如果您发现自己处于这种情况,通常可以翻转比较运算符。

相关问题