Javascript 为什么(';b';+;';a';+;+;';a';';a&';&';)的结果是什么;香蕉;?

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++

我在练习JavaScript时,我的一个朋友遇到了以下JavaScript代码:


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' )