前段时间在 Twitter 上看到一个问题

其实这是一道基础题目,考察点是类型转换以及操作符优先级。
首先这道题目中的加号并不全是用于加法的,++'a'
中的第二个加号其实是一元操作符。
一元加号操作符的优先级其实是比加法运算符高的

因此这道题目应该先看成:
'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 了。
觉得内容有帮助可以关注下我的公众号 「前端真好玩」咯,定期分享以下主题内容:
- 前端小知识、冷知识
- 原理内容
- 提升工作效率
- 个人成长
