javascript逻辑分配如何工作?

时间:2010-12-15 03:29:23

标签: javascript variable-assignment logical-operators

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

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

逻辑OR运算符将为b分配值,警报将为“1”。

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

似乎空字符串的处理方式与undefined相同。这是对的吗?

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

什么时候使用这些成语,或何时不使用?

是一个很好的例子

6 个答案:

答案 0 :(得分:24)

要让q || a评估为aq应为“虚假”值。你所做的就是所谓的“短路评估”。

回答你的问题:

  1. 逻辑运算符(如和 - &&或 - ||)也可用于其他情况。更常见的是像if这样的条件语句。 More here

  2. 空字符串不会被视为undefined。两者都是虚假的价值观。还有一些虚假的价值观。 More here

  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';

答案 1 :(得分:7)

||在Javascript中的工作方式是:

  1. 如果左操作数的计算结果为true,则返回左操作数
  2. 否则,返回右操作数
  3. &安培;&安培;效果相似。

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

    var foo = (obj && obj.property)
    
    如果foo已定义,则

    会将obj.property设置为obj并且" truthy"。

答案 2 :(得分:1)

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

我发现我经常使用此行为来指定函数参数的默认值。 E.g。

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

    // no need to test fooValue -- it's guaranteed to be defined at this point
}

答案 3 :(得分: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的第一部分为真,则它不会评估第二部分。

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

答案 4 :(得分:1)

Javascript通过truethness / falseness评估逻辑。诸如(false,“”,null,undefined0, - 0)之类的值被评估为逻辑假。

将此与懒惰评估相结合,现在,left to right评估'或'操作,并在找到true停止。因为,在你的例子中,真实性不是字面意义上的布尔值,所以返回值。

在这种情况下:

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

这也可以是其他对象。

functionThatReturnsTrue() || functionThatDoesSomething();

答案 5 :(得分:0)

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

E.g。如果您想要从对象复制字段值,当且仅当该字段已定义时

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;