在JavaScript中,如果我们有一些像这样的代码:
var a = "one";
var b = q || a;
alert (b);
逻辑或运算符将a的值赋给b,弹出框中显示"one"。
这是否仅限于赋值操作还是可以在任何地方使用?
空字符串是否与未定义的情况视为相同?
对于AND变量,它是如何工作的?组合它们会怎样?
有什么好的用法示例或不应使用这些习语的情况吗?
在JavaScript中,如果我们有一些像这样的代码:
var a = "one";
var b = q || a;
alert (b);
逻辑或运算符将a的值赋给b,弹出框中显示"one"。
这是否仅限于赋值操作还是可以在任何地方使用?
空字符串是否与未定义的情况视为相同?
对于AND变量,它是如何工作的?组合它们会怎样?
有什么好的用法示例或不应使用这些习语的情况吗?
要使您的q || a
计算为a
,q
应该是“falsy”值。您所做的被称为“短路评估”。
回答您的问题:
||
的工作方式如下:
true
,则返回左操作数&&
的工作方式类似。var foo = (obj && obj.property)
obj
已定义且为真,将把foo
设置为obj.property
。这种行为与其他脚本语言(如Perl)共享。逻辑或运算符可用作语法简写,用于指定默认值,因为逻辑或运算符在遇到第一个计算结果为true的表达式时停止计算其操作数:“计算第一个操作数,如果该值被解释为非false,则将其分配。否则重复第二个操作数。”
我发现我经常使用此行为来指定函数参数的默认值。例如:
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通过真假性来评估逻辑。 值,例如(false
,“”,null,undefined
,0
,-0)被评估为逻辑假。
将此与惰性评估相结合,“OR”操作现在从左到右
进行评估,并且一旦找到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;