蓝字关注,回复“1”加入前端进阶群 与大家一起成长
前段时间在 Twitter 上看到一个问题
![](https://i-blog.csdnimg.cn/blog_migrate/008ed38e8937194f4e444f188174e015.png)
其实这是一道基础题目,考察点是类型转换以及操作符优先级。
首先这道题目中的加号并不全是用于加法的,++'a'
中的第二个加号其实是一元操作符。
一元加号操作符的优先级其实是比加法运算符高的
![](https://i-blog.csdnimg.cn/blog_migrate/ea42209d8a404873acafc2e82e195f93.png)
因此这道题目应该先看成:
'b' + 'a' + (+'a') + 'a'
那么接下来我们来学习一下一元加号操作符的作用。其实在 JS 中总共有九种一元操作符,分别为:
+
-
!
++
--
~
typeof
delete
void
当然本文主题不是介绍所有一元操作符作用的,因此我们就简单来了解一下 +
的作用即可。
这个操作符的作用是尝试把任何东西都转成 number
,如果转换失败的话就会返回 NaN
,以下是一些转换的例子:
// 1
+1
// 1
+'1'
// 1
+true
// 0
+null
// 另外还有个骚操作,如果一个对象有 valueOf 的话
// 那么转换的是该函数的返回值
+{
valueOf: () => 1
}
因此对于 +'a'
来说,返回值应该是 NaN
。
现在的题目就转换成了这样:
'b' + 'a' + (NaN) + 'a'
虽然 NaN
代表这个值不是数字,但是它的类型还是 number
。加法操作符在数字和字符串相加的过程中会将数字转换为字符串,因此现在的题目就转换成了这样:
'b' + 'a' + 'NaN' + 'a'
所以结果就是 baNaNa
,通过调用 toLowerCase()
就变成了 banana
。
最后
虽然题目看着简单,但是考察的内容还是多方面的,当然最想说的还是 fuckJS 了。
- END -
觉得有启发,点个“在看”,转给朋友们
长按二维码关注,漫漫前端路,结伴同行
来自恺哥的推荐阅读
我就知道你在看!