Java脚本中的“&&”运算符与Java中的运算符

'&&' operator in Javascript vs in Java

我目前正在阅读Java来自Java脚本:权威指南的脚本。在第76页,写着这样一句话,

o && o.x // => 1: o is truthy, so return value of o.x

作为一名 Java 程序员,我想问一下,为什么 returning 1 而不是 'true' 在 Java 中,情况并非如此,但无论如何我知道 Java脚本不同,但逻辑与机制在任何地方都是相同的。(在 C 中,returns 1 为真。)

我想问的是,为什么这种行为完全有意义?
有什么办法,我可以确保 return 只有 true 或 false 值?

您可以使用 Boolean(o && o.x); 获得 truefalse

根据 Binary Logical Operators

的规范

The value produced by a && or || operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions.

这是 javascript 中经常使用的功能,一个常见的用例是为未定义的变量分配默认值。就像假设您期望一个选项对象作为参数但不是强制性的,因此用户可能不会传递它

function x(options){
    options = options || {};
    //now your can access optionx.a without fearing whether options is undefined
}

您可以像 !!(o && o.x) 这样的操作来始终获得 true/false

如果我们有:

expr1 && expr2

&& Returns 'expr1'是否可以转换为false;否则,returns 'expr2'。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && returns 为真;否则,returns 错误。

所以如果我们有:

Var xyz = a && b; //其中a为undefined(false),b为123,则分配undefined.

在 if 语句的情况下,这些值专门转换为布尔值。

参考以下link:“https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

这是return计算右操作数的值。如果 o.x 的值为 true,它将 return true。如果 o.x 的值为 'banana',它将 return 'banana'

var o = {x:true};
console.log(o && o.x);

技术上 && 运算符实现为 return 第一个操作数,如果它的值不为零, return 是第二个操作数,否则在许多语言中包括 Java, C/C++, Javascript, Perl... 虽然大多数语言都接受任何类型的操作数,但 Java 强制您使用布尔操作数,因此它始终 return 为真或假。 为了在 Java 脚本中强制使用布尔结果:

Boolean(a && b)

这种行为称为强制。强制是强制一个对象像其他类型一样表现的行为,逻辑运算符在试图访问要评估的对象的值时可以产生强制

重要的是要记住 truthyfalsy 值的 table,因为由于强制转换,不同的结果可能获得。

  • false 产生 false
  • 0 产生 false
  • “” 产生 false
  • NaN 产生 false
  • null 产生 false
  • undefined 产生 false

其他所有内容都会生成 true,包括文本 "0""false"、函数、数组和空对象。

给定逻辑运算符的规则,在 JavaScript 中存在 短路 评估,例如:

0 && 1; //-> 0, falsy value
!(0 && 1); //-> true, falsy value negated
!!(0 && 1); //-> false, boolean falsy value

void 0 && alert("1") //-> undefined (void produces undefined)
[] && Math.ceil(9.1) //-> 10, truthy value
{} && someFunc() //-> the result of someFunc()

0 || null; //-> null, falsy value
null || "0"; //-> "0", truthy value
"" || void 1; //-> undefined, falsy value
!!(+"5px" || {}); //-> true, boolean truthy value

当您必须验证默认值以防止错误时,强制转换很有用,例如

function divide (a, b) {
    a = +a; //-> coerced to number
    b = +b; //-> coerced to number
    if (!a) return 0; //-> NaN or zero
    return b && a / b; //-> b must be a number different from zero
}

divide(); //-> 0
divide(5); //-> NaN, no error thrown!
divide(5, "a"); //-> NaN, no error thrown!
divide(5, 0); //-> 0, division by zero prevented!
divide(49, 6); //-> 8.1666

如果你想阻止returning NaN,只需在return语句中添加另一个强制转换:

return (b && a / b) || 0;

您可以查看其他强制转换案例:JavaScript Coercion


编码愉快!