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

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

('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。
复制代码

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

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

'b' + 'a' + NaN + 'a'
// to
'b' + 'a' + "NaN" + 'a'
复制代码

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

有时候代码就是这么神奇🤖,今天周一,搬砖啦~🤡

相关文章
相关标签/搜索