【问题标题】:Logical AND (&&) and OR (||) operators逻辑 AND (&&) 和 OR (||) 运算符
【发布时间】:2014-08-18 08:53:37
【问题描述】:

逻辑 AND (&&) 和 OR (||) 运算符 --- 谁知道他们可以这样欺骗我们 :)

他们对 JS 的定义(根据this 解释)如下:

expr1 && expr2 => 如果expr1可以转换为false则返回; 否则,返回 expr2。因此,当与布尔值一起使用时,&& 如果两个操作数都为真,则返回真;否则,返回 false。

expr1 || expr2 => 如果expr1可以转换为真则返回; 否则,返回 expr2。因此,当与布尔值一起使用时,|| 如果任一操作数为真,则返回真;如果两者都为假,则返回 假的。

测试一下,确实和定义一样,但问题出在:

false || ""  //returns ""
"" || false  //returns false

所以,很明显:

(false || "") ==  ("" || false) // true

但是很遗憾

(false || "") === ("" || false) // false

到主要的两个问题:

  1. 这是一个错误吗,或者为什么 JavaScript 会强制我们使用 == 运算符 使用&&||运算符时要注意顺序?
  2. 为什么javascript无法在这个表达式中将expr1转换为true ("" || false)?。我的意思是,这不是像在 "" 前面加上 NOT (!) 运算符?

【问题讨论】:

  • "==" 强制进行类型转换。避免它总是好的
  • 答案就在问题中。 expr1 || expr2 => Returns expr1 if it can be converted to true; otherwise, returns expr2。在最后一种情况下,您有 "" === false 这是错误的

标签: javascript


【解决方案1】:

这就是它们的工作方式。这不是错误:

如果可以转换为false则返回expr1; 否则,返回 expr2

这意味着您可以使用“默认值”,如下所示:

function someFunc(passedParameter){
    var newValue = passedParameter || 1337
}

或者在满足条件时运行函数:

var myBool = true;
myBool && someFunc(); // someFunc will only be evaluated if `myBool` is truthy

More info on truthy / falsy

【讨论】:

  • 但它声明Returns expr1 if it can be converted to false。您不能将"a" 转换为false?试试!"a" 看看它的作用。
  • !"a"true,因为! 是逻辑反转。要将某些内容转换为布尔值,请使用双感叹号:!!"a"。看看what values are truthy or falsy
  • 这很有趣——从来没有这样想过。谢谢,你已经用!!"a" 澄清了这一切(因为那是实际的转换,我在考虑反转”。
  • 呃,哎呀,这就是我的意思,@fast o.O
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多