'&&';Javascript中的运算符与Java中的运算符

'&&';Javascript中的运算符与Java中的运算符,javascript,logical-operators,Javascript,Logical Operators,我目前正在阅读《JavaScript:权威指南》中的JavaScript。在第76页,写着这样一句话, o && o.x // => 1: o is truthy, so return value of o.x 作为一名Java程序员,我想问,为什么它返回1而不是Java中的“true”,事实并非如此,但无论如何,我知道JavaScript是不同的,但逻辑和机制在任何地方都是相同的。(在C中,它返回1为true。) 我想问的是,为什么这种行为有意义? 有没有办法确保只返回

我目前正在阅读《JavaScript:权威指南》中的JavaScript。在第76页,写着这样一句话,

o && o.x // => 1: o is truthy, so return value of o.x
作为一名Java程序员,我想问,为什么它返回1而不是Java中的
“true”
,事实并非如此,但无论如何,我知道JavaScript是不同的,但逻辑和机制在任何地方都是相同的。(在C中,它返回1为true。)

我想问的是,为什么这种行为有意义?
有没有办法确保只返回真值或假值?

您可以使用
布尔值(o&&o.x)
根据规范获取
true
false

&&或| |运算符生成的值不一定是类型 布尔型。所产生的价值将始终是这两种价值之一的价值 操作数表达式

这是javascript中经常使用的一个特性,一个常见的用例是在未定义变量的情况下为其指定默认值。与此类似,假设您期望一个选项对象作为参数,但它不是必需的,因此用户可能不会传递它

function x(options){
    options = options || {};
    //now your can access optionx.a without fearing whether options is undefined
}
您可以执行类似
!!(o&&o.x)
如果我们有以下情况,则始终获得真/假值

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

因此,如果我们有:

expr1 && expr2
Var xyz=a&&b//如果a是未定义的(false),b是123,那么它将分配未定义的

对于if语句,这些值专门转换为布尔值


请参阅以下链接:“

它正在返回右操作数的值。如果
o.x
的值为
true
,它将返回
true
。如果
o.x
的值是
'banana'
,它将返回
'banana'

varo={x:true};

console.log(o&&o.x)
从技术上讲
&&
运算符实现为在第一个操作数的值不为零时返回第一个操作数,在许多语言中返回第二个操作数,包括Java、C/C++、Javascript、Perl。。。 虽然大多数语言都接受任何类型的操作数,但Java强制您使用布尔操作数,因此它总是返回true或false。 要在Javascript中强制生成布尔结果,请使用:

Boolean(a && b)

这种行为称为胁迫。强制是强制对象像其他类型一样运行的操作,逻辑运算符在尝试访问要计算的对象的值时可以生成强制

记住表中的truthyfalsy值非常重要,因为由于强制,可能会得到不同的结果

  • false
    产生
    false
  • 0
    产生
    false
  • 产生
    false
  • NaN
    产生
    false
  • null
    产生
    false
  • undefined
    生成
    false
其他所有内容都会生成
true
,包括文本
“0”
“false”
、函数、数组和空对象

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

0&&1;//->0,falsy值
!(0 && 1); //-> 正确,错误值被否定
!!(0 && 1); //-> false,布尔falsy值
void 0&&alert(“1”)/>未定义(void生成未定义)
[]&&Math.ceil(9.1)/->10,真实值
{}&&someFunc()/->someFunc()的结果
0 | | null;//->空值
空| |“0”/->“0”,真实值
“”| | void 1;//->未定义的、错误的值
!!(+“5px”|{});/->真布尔真值
当您必须验证默认值以防止错误时,强制非常有用,例如

函数划分(a、b){
a=+a;/->强制为数字
b=+b;//->强制为数字
如果(!a)返回0;//->NaN或零
返回b&&a/b;//->b必须是一个不同于零的数字
}
除法();//->0
除以(5);//->南,没有抛出错误!
除以(5,“a”);//->南,没有抛出错误!
除以(5,0);//->0,被零除!
除以(49,6);//->8.1666
如果要防止返回
NaN
,只需在return语句中添加另一个强制:

return(b&a/b)|0;
您可以检查其他强制案例:



快乐编码

您可以使用
!!(o&&o.x)
这在javascript中称为短路。更好的是,使用强制:
!!(o&&o.x)
我已经知道这是如何工作的,但这些术语中没有一个。任何时候都是学习的好时机。:-)+1.