Javascript 运算符或解析为false?
我只是注意到一种奇怪的行为。我肯定不是第一个注意到这一点的人,但我想了解发生了什么 为什么Javascript 运算符或解析为false?,javascript,Javascript,我只是注意到一种奇怪的行为。我肯定不是第一个注意到这一点的人,但我想了解发生了什么 为什么true | | true?“foo':“bar”解析为“foo” 它与解析为true的true | |(true?'foo':'bar')有什么不同 jsIDLE:比,因此您的语句被解析为: (true || true) ? 'foo' : 'bar' true | | true是true,因此您得到'foo'而不是,因此您的语句被解析为: (true || true) ? 'foo' : 'bar'
true | | true?“foo':“bar”
解析为“foo”
它与解析为true
的true | |(true?'foo':'bar')
有什么不同
jsIDLE:比代码>,因此您的语句被解析为:
(true || true) ? 'foo' : 'bar'
true | | true
是true
,因此您得到'foo'
而不是代码>,因此您的语句被解析为:
(true || true) ? 'foo' : 'bar'
true | | true
是true
,因此您会得到'foo'
关于第一个
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
将与以下内容相同:
(true || true) ? 'foo' : 'bar'
true || 'foo';
因此,本质上:
true ? 'foo' : 'bar'
关于第二个
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
将与以下内容相同:
(true || true) ? 'foo' : 'bar'
true || 'foo';
所以true
或任何其他事物true
(甚至不需要为那一个评估'foo'
)关于第一个
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
将与以下内容相同:
(true || true) ? 'foo' : 'bar'
true || 'foo';
因此,本质上:
true ? 'foo' : 'bar'
关于第二个
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
将与以下内容相同:
(true || true) ? 'foo' : 'bar'
true || 'foo';
所以true
或任何其他事物true
(甚至不需要为该事物评估'foo'
)这是因为操作顺序。通常| |是在|之前处理的:但是当添加大括号时,大括号内的表达式在| |之前求值
那么第一个结果是真的?”foo':“bar”,第二个结果为true | |“foo”
可以在以下位置找到订单:这是因为操作顺序。通常| |是在|之前处理的:但是当添加大括号时,大括号内的表达式在| |之前求值
那么第一个结果是真的?”foo':“bar”,第二个结果为true | |“foo”
可以在以下位置找到顺序:关键区别在于,没有括号,|
优先于?:
。更详细地说:
第一例
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
由于|
优先于?:
相当于:
(true || true) ? 'foo' : bar'
如果左操作数为truthy,则|
运算符返回左操作数,在本例中为truthy(否则将返回右操作数)
因此,我们决定:
true ? 'foo' : 'bar'
true || 'foo'
解析为'foo'
第二种情况
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
决心:
true ? 'foo' : 'bar'
true || 'foo'
同样,如果左操作数为truthy,则|
运算符返回左操作数,在本例中为truthy。因此,这就归结为true
关键区别在于,没有括号,|
优先于?:
。更详细地说:
第一例
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
由于|
优先于?:
相当于:
(true || true) ? 'foo' : bar'
如果左操作数为truthy,则|
运算符返回左操作数,在本例中为truthy(否则将返回右操作数)
因此,我们决定:
true ? 'foo' : 'bar'
true || 'foo'
解析为'foo'
第二种情况
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar');
true || true ? 'foo' : 'bar'
true || (true ? 'foo' : 'bar')
决心:
true ? 'foo' : 'bar'
true || 'foo'
同样,如果左操作数为truthy,则|
运算符返回左操作数,在本例中为truthy。所以这就决定了true
不是我想反对大多数人,而是|
的优先级不是观察到的行为的原因,而是括号的优先级。构造逻辑或表达式“?”表达式“:”条件表达式
只不过是一个稍微受限的IF'(“expression”)”语句ELSE语句
,很久以前,当内存以千字节为单位测量时,完全优化的编译器运行和没有优化的编译器运行之间的差异是以小时为单位衡量的,如果您幸运地实现了使计算机和编译器的操作更简单、更小,那么监视器有50行80个字符。不是用户
因此,如果您使用?:
如果if
,则不需要使用if
,如果if
后面有多行,则不需要在表达式周围使用括号,如果if
后面有多行,则不需要使用大括号。以我微薄的经验来看,缺少括号是大多数人的原因,好吧,让我们称之为恼人
要将您的问题转化为更具可读性的内容,请执行以下操作:
var a;
if(true || true){
a = 'foo';
} else {
a = 'bar';
}
第二个会抛出错误,因为它的语法不正确,而不是让您挠头:
var a;
if(true || if(true){a='foo';}else{a='bar';})/*noop*/;
的优点是:代码>构造是它填充声明右侧的能力。第一个示例可以很容易地简化为:
a = true || true ? 'foo' : 'bar';
我发现,尽管有多余的内容,但如果添加括号,可读性会更好:
a = (true || true) ? 'foo' : 'bar';
但这可能更多的是个人品味。我不想反对大多数人,但|
的优先顺序不是观察到的行为的原因,而是括号的优先顺序。构造逻辑或表达式“?”表达式“:”条件表达式
只不过是一个稍微受限的IF'(“expression”)”语句ELSE语句
,很久以前,当内存以千字节为单位测量时,完全优化的编译器运行和没有优化的编译器运行之间的差异是以小时为单位衡量的,如果您幸运地实现了使计算机和编译器的操作更简单、更小,那么监视器有50行80个字符。不是用户
因此,如果您使用?:
如果if
,则不需要使用if
,如果if
后面有多行,则不需要在表达式周围使用括号,如果if
后面有多行,则不需要使用大括号。以我微薄的经验来看,缺少括号是大多数人的原因,好吧,让我们称之为恼人
要将您的问题转化为更具可读性的内容,请执行以下操作:
var a;
if(true || true){
a = 'foo';
} else {
a = 'bar';
}
第二个会抛出错误,因为它的语法不正确,而不是让您挠头:
var a;
if(true || if(true){a='foo';}else{a='bar';})/*noop*/;
的优点是:代码>构造是它的能力