Javascript中的' && '运算符与Java中的有何不同?

9

我最近在读《JavaScript权威指南》。在第76页,有这样一句话,

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

作为一名Java程序员,我想问一下,为什么它返回的是数字1而不是 'true'。在Java中,这种情况并不会发生,但无论如何我知道JavaScript是有所不同的,但逻辑AND机制在任何地方都是相同的。(在C语言中它会返回数字1作为true。) 我的问题是,这种行为有什么意义吗?是否有任何方法可以确保只返回true或false值?

你可以使用 !!(o && o.x) - Arun P Johny
这在JavaScript中被称为“短路”。 - KumarAnkit
6个回答

9
根据二进制逻辑运算符的规范,
&&或||运算符产生的值不一定是布尔类型。
产生的值将始终是两个操作数表达式之一的值。
这是JavaScript中经常使用的一个功能,一个常见的用例是在变量未定义时为其分配默认值。例如,假设您期望参数作为选项对象,但不是必需的,因此用户可能不会传递它。
function x(options){
    options = options || {};
    //now your can access optionx.a without fearing whether options is undefined
}

你可以使用类似!!(o && o.x)的方法,始终获取一个true/false值。

4

如果我们有:

expr1 && expr2

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

所以,如果我们有:

Var xyz = a && b;//其中 a 为未定义(false),b 为 123,则会分配 undefined。

在 if 语句的情况下,这些值会被特别转换为布尔值。

请参考以下链接: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators"


2
您可以使用 Boolean(o && o.x);来获取 true 或者 false

最好使用强制转换:!!(o && o.x) - jherax

1

从技术上讲,&& 运算符在许多语言中实现为如果第一个操作数的值不为零,则返回第一个操作数;否则返回第二个操作数。这些语言包括Java、C/C++、Javascript、Perl等。 虽然大多数语言接受任何类型的操作数,但Java强制使用布尔操作数,因此它总是返回true或false。 为了在Javascript中强制获得布尔结果,请使用:

Boolean(a && b)

1
它返回右操作数的值。如果o.x的值为true,则返回true。如果o.x的值为'banana',则返回'banana'

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


1
这种行为被称为强制类型转换。强制类型转换是将对象强制转换为其他类型的操作,逻辑运算符在试图访问要评估的对象的值时可以产生强制类型转换
记住真值假值的表格非常重要,因为由于强制类型转换,可能会得到不同的结果。
  • 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

如果你想防止返回 NaN,只需在返回语句中添加另一个强制转换:
return (b && a / b) || 0;

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

快乐编程!


1
我已经知道这是如何工作的,但不知道其中任何一个术语。随时学习都是好时机。 :-) +1 - T-moty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接