回答
取1和带走-1,这是与加入1.
换句话说
1 - (-1)
= 1 + 1
= 2
这两者为数字转换,并且将它们相加。在javascript中,- "1"
实际上只是-1
,所以"1" - - "1"
是1 + 1
,因为它将两者都转换为数字。请注意,如果你这样做"1" + "1"
的JavaScript将其视为级联,并会给予"11"
在Javascript中:
"1" + 1 = "1" + "1" = 1 + "1" = "11"
-1 + "1" = "-11"
1 + "-1" = "1-1"
这就是为什么数学在JavaScript如此不可思议,但减法转换为数字(因为减去字符串没有按”没有意义。)
减去一个负数与添加该数的绝对值是一样的。这是数学的一个共同特性,而不是javascript。正如所写,代码当然是愚蠢的。这可能是程序员不熟悉parseInt
的结果,它试图避免加号被解释为字符串连接的问题。
1 - - 1 == 1 + 1 // true
"1"- -"1" == "1" + "1" // false
"1" - - "1" //as "-" is an arithmetic operator
(numeric equivalent of "1"-> parseInt("1", 10)) - - (numeric equivalent of "1")
= 1 - - 1
= 1 - (-1)
= 2
这是JavaScript的类型强制方法的结果。
在涉及数字和字符串值与
+
操作表达式,JavaScript的数值转换为字符串。在涉及其他运算符的语句中,JavaScript不会将数值转换为字符串。
此引用是针对相反的情况(将数值转换为字符串,但可能适用相同的规则)。
给出的另一个例子是(+"1.1") + (+"1.1") = 2.2
。在这种情况下,括号会导致JavaScript将+
运算符绑定为字符串作为一元运算符+
,从而将字符串转换为数字类型。
更多详情https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals
由于您的例子包括“其他运营商”,JavaScript的出现在-
运营商绑定为一元阴性,做计算(其中有效果之前强制转换字符串为数字类型添加字符串中表示的数字值)。
你还应该提到相反的地方,字符串被转换为数值(这就是发生的情况)。 –
的确如此,谢谢。我不确定相反的情况是否完全受引用页面支持,但我认为它提供了关于手头问题的公平解释。 – Kyle
这是因为双负为正(short video explanation,long explanation,logical concept of double negation)与隐data type conversion“帮助” - 在JavaScript中,我们的情况。
所以,
1 - - 1 // = 2
但
1 - - - 1 // = 0, weird but it works :-)
为什么?因为当对号码进行操作时,每个偶数的' - '符号都被评估为'+',并且每个奇数的' - '符号都会给出' - '。鉴于这些,在上面的第一个例子“1 - 1 = 2”中我们有2个减号,所以表达式实际上是“1 + 1 = 2”,这是正确的。在第二个例子中,我们有3个减号,表达式变为“1 - 1 = 0”,这也是正确的。
使用相同的原理,有人(一dark dark overlord也许:-),可以写东西沿着这些路线,只是为了混淆用途:
var a = 3 + - + - + - + - + - - - - - + + + + + - - - + + + 1
,并会问,如果这给出了一个错误?使用上面相同的算法,我们可以说我们的“表达式”有12个“ - ”符号,12个是偶数=>所有这些“ - ”符号都返回“+”,所以基本上我们可以重写上面的分配:
var a = 3 + 1 // which gives 4
其他怪异的例子:
- - - - + + + - + + + - - - + + - + + - - 3 // returns -3
- - - - + + + - + + + - - - + + - + + - - - - - + + 3 // returns 3
- + - - - - new Date() // return current negative timestamp
- (+ - - -(function() { return 3; })()) // returns 3
var a = - + - 1, b = - - (- - - a); a + b // returns 0
信息:没有dark overlords写此评论的:-)过程中受到伤害。 “
- 1. 的JavaScript +运营商VS - 运营商
- 2. Javascript:?运营商
- 3. Javascript +运营商
- 4. javascript“=>”运营商
- 5. 的Javascript平等运营商
- 6. 的JavaScript =>运营商
- 7. Javascript指派运营商
- 8. 该运营商在JavaScript
- 9. JavaScript - === vs ==运营商性能
- 10. 空 - 结合运营商和运营商&&
- 11. 运营商的情况下运营商
- 12. 或运营商与三元运营商
- 13. R%*%运营商
- 14. instanceof运营商
- 15. Bigint +运营商
- 16. Groovy *。运营商
- 17. '运营商='
- 18. jQuery @运营商?
- 19. ??运营商system.DBNull
- 20. 运营商
- 21. 令运营商
- 22. &&运营商JSONpath()
- 23. 运营商
- 24. &&和||运营商
- 25. C#&&,||运营商
- 26. Java ==!= && ||运营商?
- 27. C#? :运营商
- 28. Ternery运营商
- 29. Bigint *运营商
- 30. +运营商
减法负数实际上是加上它...... 1 - (-1)= 1 + 1 = 2 – opalenzuela