当我的一个朋友看到下面的JavaScript代码时,我正在练习一些JavaScript代码:
文档。write(“b”+“a”+“a”+“a”).toLowerCase();
上面的代码回答“香蕉”! 有人能解释一下原因吗?
当我的一个朋友看到下面的JavaScript代码时,我正在练习一些JavaScript代码:
文档。write(“b”+“a”+“a”+“a”).toLowerCase();
上面的代码回答“香蕉”! 有人能解释一下原因吗?
当前回答
在W3Schools或Mozilla开发者网络上阅读更多关于NaN的信息
其他回答
'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')仅由字符串字面量和加法运算符组成。
字符串字面量“字符串字面量是用单引号或双引号括起来的零个或多个字符。” 加法运算符(+)加法运算符执行字符串连接或数字加法。
所采取的隐式操作是调用字符串上的ToNumber
ToNumber应用于字符串类型“ToNumber应用于字符串将语法应用于输入字符串。如果语法不能将String解释为StringNumericLiteral的扩展,那么ToNumber的结果就是NaN。”
解释器具有如何解析表达式的规则,方法是将表达式分解为左手表达式和右手表达式的组件。
第一步:'b' + 'a'
左表达式:'b' 左值:'b'
运算符:+(表达式的一侧是字符串,因此字符串连接)
正确表达:'a' 正确值:'a'
结果:“ba”
第二步:“ba”+“a”
左表达式:'ba' 左值:'ba'
运算符:+(表达式的一侧是字符串,因此字符串连接)
正确表达式:+ 'a'(这计算字符'a'的数学值,假设它是一个正数,来自于+号——负号也可以在这里工作,表示负数——这导致NaN) 右值:NaN(因为操作符是字符串连接,所以在连接期间对该值调用toString)
论点:“香蕉”
第三步:“香蕉”+“a”
左表达式:“baNaN” 左值:'baNaN'
运算符:+(表达式的一侧是字符串,因此字符串连接)
正确表达:'a' 正确值:'a'
结果:“香蕉”
在此之后,分组表达式已经被求值,并调用toLowerCase,这给我们留下了banana。
看看这里的魔力吧。第二个加号是一个一元运算符,它给出NaN
游戏机。log ((b”+ + +的成就)。toLowerCase ()); log控制台(“b”+“a”+“a”+“a”); 游戏机。log ((b”成就+成就+成就)toLowerCase ());
这只是因为+运算符。
我们可以从中获得更多的知识。
=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator
Which later on try to convert next character to the number.
例如
const string = '10';
你可以通过两种方式将字符串转换为数字:
数字(字符串); +字符串;
回到最初的查询; 这里它试图将下一个字符('a')转换为数字,但突然我们得到了错误NaN,
( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))
但它将其视为字符串,因为前一个字符在字符串中。 所以它会是
( ('b') + ('a') + 'NaN' + ('a'))
最后它将其转换为toLowerCase(),因此它将是banana
如果你把数字放在它旁边,你的结果将会改变。
( 'b' + 'a' + + '1' + 'a' )
它是'ba1a'
const例二= (b + a + + a + a) .toLowerCase ();/ /“香蕉” const example2 = (b + a + + ' 1 ' + ' a ') .toLowerCase ();/ /“ba1a” console.log(例二); console.log (example2);
('b' + 'a' + + 'a' + 'a').toLowerCase()
为了清晰起见,让我们将其分解为两个步骤。首先,我们获得括号表达式的值,然后对结果应用toLowerCase()函数。
第一步
'b' + 'a' + + 'a' + 'a'
从左到右,我们有:
'b' + 'a'返回ba,这是常规连接。 ba++ 'a'尝试将Ba与+ 'a'连接。然而,由于一元操作符+试图将其操作数转换为数字,返回值NaN,然后在与原始ba -连接时将NaN转换为字符串,从而产生baNaN。 baNaN + 'a'返回baNaNa。同样,这是常规的串联。
在这个阶段,第一步的结果是baNaNa。
第二步
对第一步返回的值应用.toLowerCase()会得到:
香蕉
JavaScript中有许多类似的双关语。