在Javascript中,为什么会出现-';54'+;30是-24(javascript中的类型强制)

在Javascript中,为什么会出现-';54'+;30是-24(javascript中的类型强制),javascript,operator-precedence,unary-operator,Javascript,Operator Precedence,Unary Operator,为什么我得到的是-'54'+30表达式的结果为-24然而,当我试图从表达式中删除(负)-时,它只是字符串的串联,并将5430作为输出。有人能解释一下它是如何工作的吗 console.log('54'+30) console.log('54'+30),因为具有高于的加法 一元求反还将其操作数转换为一个数字Per: 一元运算符将其操作数转换为数字类型,然后 否定它。对+0求反生成-0,对-0求反生成+0 在-'54'+30的情况下,步骤如下: 计算一元数- 右侧操作数是一个字符串,因此它被转换为数

为什么我得到的是
-'54'+30
表达式的结果为-24然而,当我试图从表达式中删除(负)
-
时,它只是字符串的串联,并将
5430
作为输出。有人能解释一下它是如何工作的吗

console.log('54'+30)
console.log('54'+30)
,因为具有高于的加法

一元求反还将其操作数转换为一个
数字
Per:

一元运算符将其操作数转换为数字类型,然后 否定它。对+0求反生成-0,对-0求反生成+0

-'54'+30
的情况下,步骤如下:

  • 计算一元数
    -
  • 右侧操作数是一个
    字符串
    ,因此它被转换为
    数字
  • 将对
    +
    进行评估
  • 由于步骤2,左侧操作数是一个
    数字
    ,因此
    +
    操作是加法而不是串联

  • -
    运算符正在执行类型强制。将字符串转换为数字类型有一种常见的Javascript习惯用法:

    const n = +'60'
    

    这使得
    n
    在数字上等于
    60
    ,而不仅仅是字符串形式。这是相同的处理,只是您使用的是一个负运算符,它将反转值上的符号,并提供
    -60

    使用
    +
    -
    符号将强制其类型。所以,-54'+30将进行数学运算并返回-24

    但是,如果您尝试这样做:

    -'54'+'30' // -5430
    
    然后它将不会键入强制,因为'54'和'30'都是字符串。JavaScript不会强迫它做数学运算

    所以,要强制类型,应该有不同的值,比如string+number可以被强制类型,其中string将被强制为number

    关于类型强制如何工作的有用链接


    有关完整的详细信息,请参阅类型强制规则。

    -
    运算符将其操作数转换为数字,然后完成数学运算。不使用减号运算符,而是执行字符串连接。很容易理解请尝试
    console.log(typeof-'54')
    我已经在问题中添加了console,当您执行
    console.log('-54'+30)
    时,结果是什么?看看这是怎么变成字符串的?那么,你认为你第一行中的
    -
    实际上在做什么?@Igor-I Understand console.log('-54'+30)只是字符串连接。我想答案对我解释得很好。什么?即使您尝试+54'+30,它也不会连接。运算符将它们转换为数字。@BhojendraNepal对,这就是我要说的。转换发生在连接发生之前。由于左侧操作数是一个数字,
    +
    运算符执行加法而不是串联。运算符优先级无关紧要。删除有误导性的第一行。。。看我的答案,你可能会得到一些提示。@BhojendraNepal我不同意。如果一元否定的优先级较低,它们将首先连接。考虑<代码> -(‘54’+ 30)< /代码> VS代码> -54′+ 30 < /代码>。一元数是进行转换的对象,如果它发生在后面,则会发生串联。-'54'将进行类型转换,但是如果另一个操作数仍然是字符串,为什么要强制它呢?你的说法是对的。但在这种情况下并非如此。在您最后的评论中,您说明了将首先评估哪一个。但我不是这么说的。我是说为什么需要进行类型转换。我在MDN中看到了关于类型转换规则的更好的解释,但目前无法找到该解释。:)