今天在微信前端群里看到一个有意思的面试题:前端
('b' + 'a' + + 'a' + 'a').toLowerCase() 结果是什么?
复制代码
好吧,才疏学浅的我看到这题的答案是:面试
baaa
复制代码
banana
复制代码
既然这么说了,那这必定是错误答案了,下面咱们来解析一下这个题:微信
1. js运算优先级和隐士转换函数
仔细一想,这题估计和JavaScript运算符优先级、隐式转化有关系。
因而先去MDN查了一下JavaScript运算符优先级
我先把上面代码用到的运算符和优先级列举出来:spa
优先级 | 运算类型 | 关联性 | 运算符 |
---|---|---|---|
20 | 圆括号 | n/a | (...) |
16 | 一元正号 | 从右至左 | + ... |
13 | 加法 | 从左至右 | ... + ... |
好了,如今咱们来解析一下这个代码:code
'b' + 'a' + (+ 'a') + 'a'
一元正号的优先级高于加法,因此咱们这样用括号会让这个代码更加清晰<br>
先运算优先级高的,也就是括号里面的,在与运算括号外面的
复制代码
2. 一元正号 运算对象
这时候就涉及到第二个重要的知识点,一元正号的运算,先来看官方文档:ip
一元正号运算符位于其操做数前面,计算其操做数的数值,若是操做数不是一个数值,会尝试将其转换成一个数值。
尽管一元负号也能转换非数值类型,可是一元正号是转换其余对象到数值的最快方法,也是最推荐的作法,由于它不会对数值执行任何多余操做。
它能够将字符串转换成整数和浮点数形式,也能够转换非字符串值true,false和null。小数和十六进制格式字符串也能够转换成数值。
负数形式字符串也能够转换成数值(对于十六进制不适用)。若是它不能解析一个值,则计算结果为 NaN。
复制代码
那上面代码的+ 'a'就是会变成NaN,过程以下:文档
'b' + 'a' + NaN + 'a'
// to
'b' + 'a' + "NaN" + 'a'
复制代码
最终在调用toLowerCase函数转成小写,就变成了banana字符串
有时候代码就是这么神奇🤖,今天周一,搬砖啦~🤡