18

在javascript中,如果我们有一些代码,例如

var a = "one";
var b = q || a;
alert (b);

逻辑 OR 运算符会将 a 的值分配给 b,并且警报将为“一”。

这仅限于作业还是我们可以在任何地方使用它?

似乎空字符串被视为未定义。这是正确的吗?

这如何与 AND 变量一起使用?它们的组合呢?

什么时候使用这些成语,或者什么时候不使用,有什么好的例子?

4

6 回答 6

27

对于您q || a要评估的a,q应该是一个“虚假”值。您所做的称为“短路评估”。

回答您的问题:

  1. 逻辑运算符(如 and -&&或 - ||)也可以在其他情况下使用。更一般地在条件语句中,如if. 更多在这里

  2. 空字符串不被视为undefined. 两者都是虚假值。还有一些更虚假的值。更多在这里

  3. AND,或者&&在 JavaScript 中,不是变量。它是一个运算符

  4. 您使用的成语很常见。

    var x = val || 'default'; //is generally a replacement for

    var x = val ? val : 'default' //or

    if (val) var x = val; else var x = 'default';

于 2010-12-15T03:45:27.587 回答
9

Javascript 中的工作方式||是:

  1. 如果左操作数的计算结果为true,则返回左操作数
  2. 否则,返回正确的操作数

&& 的工作原理类似。

您可以将其用于在线存在检查,例如:

var foo = (obj && obj.property)

将设置fooobj.property如果obj已定义且“真实”。

于 2010-12-15T03:43:50.740 回答
1

此行为与 Perl 等其他脚本语言共享。逻辑 OR 运算符可以用作指定默认值的语法简写,因为逻辑 OR 运算符在遇到第一个计算结果为 true 的表达式时停止计算其操作数:“评估第一个操作数,如果值被解释不为假,赋值。否则重复第二个操作数。

我发现我经常使用这种行为来指定函数参数的默认值。例如

function myFunction(foo, bar) {
    var fooValue = foo || "a";

    // no need to test fooValue -- it's guaranteed to be defined at this point
}
于 2010-12-15T03:44:17.417 回答
1

我不太确定我是否遵循您的问题。您可以在任何可以使用表达式的地方使用表达式,并且两个表达式上的逻辑运算符会产生一个表达式。

alert(q||a);
alert(true||false);

var x=5;
var y=0;
if (y!=0 && x/y>2) { /*do something*/ }

最后一点很有用。像大多数语言一样,Javascript “短路” AND 和 OR。如果 AND 的第一部分为假,它不会评估第二位 - 为您节省除以 0。如果 OR 的第一部分为真,则不会评估第二部分。

但是您可以在任何可以使用表达式的地方使用布尔运算符。

于 2010-12-15T03:45:56.637 回答
1

Javascript 通过真/假来评估逻辑。( false, "", null, undefined, 0, -0) 等值被评估为逻辑假。

将其与惰性求值相结合,“OR”操作现在开始求值,left to right一旦发现就停止true。由于在您的示例中,真实性不是字面上的布尔值,因此返回该值。

在这种情况下:

x = 0; y = 5; alert(y || x)/*returns 5*/;  alert(x || y)/*also returns 5*/;

这也可以是其他对象。

functionThatReturnsTrue() || functionThatDoesSomething();
于 2010-12-15T03:52:48.320 回答
1

恕我直言 - 不要用于布尔类型分配。这可能会令人困惑。如undefined !== false,即false本身就是一个值。

例如,如果你想从一个对象中复制一个字段值,当且仅当该字段被定义时

var bar.value = false;
var foo = true;

var foo = bar.value || foo;  // ==> should be false as bar.value is defined

对于布尔类型赋值,你真的应该使用

var foo = (bar.value !== undefined) ? bar.value : foo;
于 2011-09-13T15:11:51.283 回答