('b'+'a'+ + 'a'+'a').toLowerCase() === 'banana'?

6,610 阅读2分钟

前段时间在 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 了。

觉得内容有帮助可以关注下我的公众号 「前端真好玩」咯,定期分享以下主题内容:

  • 前端小知识、冷知识
  • 原理内容
  • 提升工作效率
  • 个人成长