在javascript中,如果我们有一些代码,例如
var a = "one";
var b = q || a;
alert (b);
逻辑 OR 运算符会将 a 的值分配给 b,并且警报将为“一”。
这仅限于作业还是我们可以在任何地方使用它?
似乎空字符串被视为未定义。这是正确的吗?
这如何与 AND 变量一起使用?它们的组合呢?
什么时候使用这些成语,或者什么时候不使用,有什么好的例子?
在javascript中,如果我们有一些代码,例如
var a = "one";
var b = q || a;
alert (b);
逻辑 OR 运算符会将 a 的值分配给 b,并且警报将为“一”。
这仅限于作业还是我们可以在任何地方使用它?
似乎空字符串被视为未定义。这是正确的吗?
这如何与 AND 变量一起使用?它们的组合呢?
什么时候使用这些成语,或者什么时候不使用,有什么好的例子?
对于您q || a
要评估的a
,q
应该是一个“虚假”值。您所做的称为“短路评估”。
回答您的问题:
Javascript 中的工作方式||
是:
true
,则返回左操作数&& 的工作原理类似。
您可以将其用于在线存在检查,例如:
var foo = (obj && obj.property)
将设置foo
为obj.property
如果obj
已定义且“真实”。
此行为与 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
}
我不太确定我是否遵循您的问题。您可以在任何可以使用表达式的地方使用表达式,并且两个表达式上的逻辑运算符会产生一个表达式。
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 的第一部分为真,则不会评估第二部分。
但是您可以在任何可以使用表达式的地方使用布尔运算符。
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();
恕我直言 - 不要用于布尔类型分配。这可能会令人困惑。如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;