JavaScript中一个运算符优先级问题引发的思考

本文通过一道关于JavaScript中运算符优先级的问题,探讨了在实际编程中容易被忽视的细节。文章解释了为什么看似简单的代码实际上却有着复杂的运行逻辑,并深入分析了字符串拼接、布尔转换以及三目运算符的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript中一个运算符优先级问题引发的思考

题目

假设 val 已经声明,可定义为任何值。则下面js代码有可能输出的结果为:

console.log('Value is ' + (val != '0') ? 'define' : 'undefine');

A. Value is define
B. Value is undefine
C. define
D. undefine
E. Value is define 或者 Value is undefine
F. define 或者 undefine
G. 其它选项都有可能

如果是你,你会选什么呢?


可以说,大部分人都会在A、B、E中选择,以为重点在后面的三目运算符,前面字符串原样输出就是了。但是答案是 C


分析

因为我们忽略了运算符的优先级。要知道,加号 + 优先级高于三目运算 ? :,低于括号 ()。不管 (val != '0') 的真假,'Value is ' + (val != '0') 是一个字符串并且转换成布尔值一定是 true


下面我们来具体分析里面的每一部分。

先来看看括号里面的情况,题目已经说了:

假设 val 已经声明,可定义为任何值。

所以,(val != '0') 的值可以是 true 或者 false ,那么这个就涉及到JavaScript的一些隐式转换逻辑。

众所周知,

0 == '0'  // true
null == undefined  // true
false == '0'  // true

常用的隐式转换逻辑

x+""  //等价于String(x)

+x  //等价于Number(x),也可以写成x-0

!!x  //等价于Boolean(x)

附录 - Javascript类型转换

Javascript类型转换

回到本题条件永远为真,并且只输出 'define'

Boolean

还有一个需要注意的地方

下面程序的显示结果是?

var x = new Boolean(false);
if (x) {
  alert('hi');
}
var y = Boolean(0);
if (y) {
  alert('hello'); 
}

x为Boolean对象,在if语句里的判断为true,虽然x的值为false,但是作为对象,if会直接判断为true。y为Boolean值,在if里的判断就是false值。所以会显示 'hi'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值