('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