首页 > 科技 > ('b' + 'a' + + 'a' + 'a').toLowerCase()输出什么?

('b' + 'a' + + 'a' + 'a').toLowerCase()输出什么?

今天在微信前端群里看到一个有意思的面试题:

('b' + 'a' + + 'a' + 'a').toLowerCase() 结果是什么?

好吧,才疏学浅的我看到这题的答案是:baaa

先说下正确答案,以便大家跟着我一个思路:banana

既然这么说了,那这一定是错误答案了,下面我们来解析一下这个题:

1. js运算优先级和隐士转换

仔细一想,这题估计和JavaScript运算符优先级、隐式转化有关系。
于是先去MDN查了一下JavaScript运算符优先级
我先把上面代码用到的运算符和优先级列举出来:


好了,现在我们来解析一下这个代码:

'b' + 'a' + (+ 'a') + 'a'

一元正号的优先级高于加法,所以我们这样用括号会让这个代码更加清晰
先运算优先级高的,也就是括号里面的,在与运算括号外面的


2. 一元正号 运算

这时候就涉及到第二个重要的知识点,一元正号的运算,先来看官方文档:

一元正号运算符位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。

尽管一元负号也能转换非数值类型,但是一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为它不会对数值执行任何多余操作。

它可以将字符串转换成整数和浮点数形式,也可以转换非字符串值true,false和null。小数和十六进制格式字符串也可以转换成数值。

负数形式字符串也可以转换成数值(对于十六进制不适用)。如果它不能解析一个值,则计算结果为 NaN。

注意看上面的这段话:如果操作数不是一个数值,会尝试将其转换成一个数值和如果它不能解析一个值,则计算结果为 NaN

那上面代码的+ 'a'就是会变成NaN,过程如下:

'b' + 'a' + NaN + 'a'

// to

'b' + 'a' + "NaN" + 'a'

最终在调用toLowerCase函数转成小写,就变成了banana

有时候代码就是这么神奇

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/291180.html