我在练习JavaScript时,我的一个朋友发现了以下JavaScript代码:
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
上面的代码回答"banana"
!有人能解释为什么吗?
'a'
解析为NaN
(“非数字”),因为它强制将字符串转换为数字,而字符a
不能解析为数字。
document.write(+'a');
'b' + 'a' + + 'a' + 'a'
...被评估为。。。。
'b' + 'a' + (+'a') + 'a'
(请参阅:运算符优先级)
('a')
尝试使用一元加号运算符将'a'
转换为数字。因为'a'
不是数字,所以结果是NaN
(“不是数字”):
'b' + 'a' + NaN + 'a'
虽然NaN代表“不是数字”,但它仍然是数字类型;当添加到字符串时,它会像任何其他数字一样连接:
'b' + 'a' + NaN + 'a' => 'baNaNa'
最后,它是小写的:
'baNaNa'.toLowerCase() => 'banana'
('b' + 'a' + + 'a' + 'a').toLowerCase()
为了清楚起见,让我们将其分解为两个步骤。首先,我们得到带括号表达式的值,然后对结果应用toLowerCase()
函数。
'b' + 'a' + + 'a' + 'a'
从左到右,我们有:
'b'a'
返回ba,这是常规连接李> ba'a'
尝试将ba与'a'
连接起来。然而,由于一元运算符
试图将其操作数转换为一个数字,因此返回值NaN,当与原始ba连接时,该值将转换为字符串,从而产生baNaN李> baNaN
“a”返回香蕉。同样,这是常规连接在这个阶段,第一步的结果是香蕉。
在步骤一返回的值上应用. toLowerCase()
给出:
香蕉
在JavaScript中有许多类似的双关语,您可以查看。