今天看啥  ›  专栏  ›  WangYingYaTou

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

WangYingYaTou  · 掘金  ·  · 2019-11-11 07:41
阅读 38

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

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

('b' + 'a' + + 'a' + 'a').toLowerCase()    结果是什么?
复制代码

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

        baaa
复制代码


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


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

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

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

优先级 运算类型 关联性 运算符
20 圆括号 n/a (...)
16 一元正号 从右至左 + ...
13 加法 从左至右 ... + ...

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

            'b' + 'a' + (+ 'a') + 'a'
            
            一元正号的优先级高于加法,所以我们这样用括号会让这个代码更加清晰<br>
            先运算优先级高的,也就是括号里面的,在与运算括号外面的
复制代码

2. 一元正号 运算

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

一元正号运算符位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。 
尽管一元负号也能转换非数值类型,但是一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为它不会对数值执行任何多余操作。
它可以将字符串转换成整数和浮点数形式,也可以转换非字符串值true,false和null。小数和十六进制格式字符串也可以转换成数值。
负数形式字符串也可以转换成数值(对于十六进制不适用)。如果它不能解析一个值,则计算结果为 NaN。
复制代码

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

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

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

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

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




原文地址:访问原文地址
快照地址: 访问文章快照