在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
的情况下,步骤如下:
-
字符串
,因此它被转换为数字
+
进行评估数字
,因此+
操作是加法而不是串联-
运算符正在执行类型强制。将字符串转换为数字类型有一种常见的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中看到了关于类型转换规则的更好的解释,但目前无法找到该解释。:)