Javascript 为什么(';b';+;';a';+;+;';a';';a&';&';)的结果是什么;香蕉;?
我在练习JavaScript时,我的一个朋友遇到了以下JavaScript代码:Javascript 为什么(';b';+;';a';+;+;';a';';a&';&';)的结果是什么;香蕉;?,javascript,type-conversion,Javascript,Type Conversion,我在练习JavaScript时,我的一个朋友遇到了以下JavaScript代码: document.write('b'+'a'+'a'+'a').toLowerCase()+'a'解析为NaN(“非数字”),因为它将字符串强制为数字,而字符a无法解析为数字。 document.write(+'a') 为了清楚起见,让我们将其分解为两个步骤。首先,我们得到带括号表达式的值,然后对结果应用toLowerCase()函数 第一步 在L-R上,我们有: 'b'+'a'返回ba,这是常规连接 ba++
document.write('b'+'a'+'a'+'a').toLowerCase()
+'a'
解析为NaN
(“非数字”),因为它将字符串强制为数字,而字符a
无法解析为数字。
document.write(+'a')代码>
为了清楚起见,让我们将其分解为两个步骤。首先,我们得到带括号表达式的值,然后对结果应用toLowerCase()
函数
第一步
在L-R上,我们有:
'b'+'a'
返回ba,这是常规连接
ba++'a'
尝试将ba与++'a'
连接起来。但是,由于一元运算符+
试图将其操作数转换为数字,因此返回值NaN,然后在与原始的ba连接时将其转换为字符串,从而产生baNaN
baNaN
+“a”返回香蕉。同样,这是常规连接。
在这个阶段,第一步的结果是香蕉
第二步
对第一步返回的值应用.toLowerCase()
,可以得到:
香蕉
您可以查看JavaScript中的许多内容
'b' + 'a' + + 'a' + 'a'
…被评估为
'b' + 'a' + (+'a') + 'a'
(见:)
(++'a')
尝试使用。因为'a'
不是数字,所以结果是(“不是数字”):
虽然NaN代表“不是数字”,但它仍然是数字类型;当添加到字符串时,它会像任何其他数字一样连接:
'b' + 'a' + NaN + 'a' => 'baNaNa'
最后,它是小写的:
'baNaNa'.toLowerCase() => 'banana'
这只是因为+运算符
我们可以从中获得更多的知识
=> ( ('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(),因此它将是香蕉
若你们把数字放在它旁边,你们的结果就会改变
( 'b' + 'a' + + '1' + 'a' )
应该是“ba1a”
const example1=('b'+'a'+'a'+'a'+'a')。toLowerCase();/'香蕉的
常量example2=('b'+'a'++'1'+'a')。toLowerCase();/'ba1a'
console.log(示例1);
console.log(示例2)代码>这行代码对表达式求值,然后根据返回的值调用方法
表达式('b'++'a'++'a'++'a')
仅由字符串文本和加法运算符组成
- “字符串文字是用单引号或双引号括起来的零个或多个字符。”
- “加法运算符执行字符串串联或数字加法。”
所采取的隐式操作是对字符串调用ToNumber
- 应用于字符串的ToNumber将语法应用于输入字符串。如果语法无法将字符串解释为StringNumericLiteral的扩展,则ToNumber的结果为NaN
解释器通过将表达式分解为左表达式和右表达式的组件,具有解析表达式的规则
第1步:'b'+'a'
左表达式:'b'
左值:“b”
运算符:+(表达式的一侧是字符串,因此字符串连接)
右表达式:'a'
右值:“a”
结果:'ba'
第二步:'ba'++'a'
左表达式:'ba'
左值:“ba”
运算符:+(表达式的一侧是字符串,因此字符串连接)
右表达式:+'a'
(这会计算字符“a”的数学值,假设它是+符号中的正数--负号在这里也会起作用,表示负数--结果为NaN)
右值:NaN(因为运算符是字符串串联,所以在串联过程中对该值调用toString)
结果:“巴南”
第三步:'baNaN'+'a'
左表达式:'baNaN'
左值:“巴南”
运算符:+(表达式的一侧是字符串,因此字符串连接)
右表达式:'a'
右值:“a”
结果:“香蕉”
在此之后,对分组表达式求值,并调用toLowerCase,这就给我们留下了香蕉。使用+将在JavaScript中将任何值转换为数字!
所以
这里首先要了解和学习的主要内容是在JavaScript中的任何值之前使用+
,将该值转换为数字,但如果该值无法转换,JavaScript引擎将返回NaN,这意味着,不是数字(不能转换为数字,伙计!)故事的其余部分如下:
看看这里的魔法吧。第二个加号是一元运算符,表示“NaN”
console.log(('b'+'a'+'a'+'a').toLowerCase());
log(('b'+'a'+'a'+'a'+'a');
log(('b'+'a'+'a'+'a').toLowerCase())代码>
阅读更多关于NaN at或的信息,第二个加号是一元运算符:+“a”
是NaN
。在控制台中,自己编写+'a'
,看看会发生什么。对于那些渴望更多的人来说。见强相关:也相关:
( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))
( ('b') + ('a') + 'NaN' + ('a'))
( 'b' + 'a' + + '1' + 'a' )