2014-02-07 147 views
0

我在某处看到下面的代码。Javascript - 运营商

var num = "1" - - "1"; 
console.log(num); 

输出是2.有人解释我在这里发生了什么。

在此先感谢。

+0

减法负数实际上是加上它...... 1 - (-1)= 1 + 1 = 2 – opalenzuela

回答

4

当使用数学运算(除了用于字符串连接的+)字符串,字符串将尝试转换为数字。

一减(减一)是两。

"1" - - "1"是相同1 - -11 + 1

+0

+1对于”当使用字符串的数学运算时,字符串将尝试转换为数字。说真的,我不知道。 –

+0

但是,当一个或多个字符串是操作数时,JavaScript会将'+'运算符解释为串联,而不是数学运算,所以并不是所有情况。 – Kyle

+0

@凯尔是的,没错。 – xdazz

0

取1和带走-1,这是与加入1.

换句话说

1 - (-1) 
= 1 + 1 
= 2 
1

这两者为数字转换,并且将它们相加。在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如此不可思议,但减法转换为数字(因为减去字符串没有按”没有意义。)

1

减去一个负数与添加该数的绝对值是一样的。这是数学的一个共同特性,而不是javascript。正如所写,代码当然是愚蠢的。这可能是程序员不熟悉parseInt的结果,它试图避免加号被解释为字符串连接的问题。

1 - - 1 == 1 + 1 // true 
"1"- -"1" == "1" + "1" // false 
1
"1" - - "1" //as "-" is an arithmetic operator 
(numeric equivalent of "1"-> parseInt("1", 10)) - - (numeric equivalent of "1") 
= 1 - - 1 
= 1 - (-1) 
= 2 
1

这是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的出现在-运营商绑定为一元阴性,做计算(其中有效果之前强制转换字符串为数字类型添加字符串中表示的数字值)。

+0

你还应该提到相反的地方,字符串被转换为数值(这就是发生的情况)。 –

+0

的确如此,谢谢。我不确定相反的情况是否完全受引用页面支持,但我认为它提供了关于手头问题的公平解释。 – Kyle

0

这是因为双负为正(short video explanationlong explanationlogical 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写此评论的:-)过程中受到伤害。 “