【问题标题】:Javascript - OperatorsJavascript - 运算符
【发布时间】:2014-02-07 07:43:02
【问题描述】:

我在某处看到了下面的代码。

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

输出是 2。有人解释一下这里到底发生了什么。

提前致谢。

【问题讨论】:

  • 减去一个负数,其实就是加... 1 - (-1) = 1 + 1 = 2
  • -+-+-+-+3 === 3,仅供参考!

标签: javascript operators


【解决方案1】:

当对字符串进行数学运算时(除了+用于字符串连接),字符串会尝试转换为数字。

一减(减一)等于二。

"1" - - "1" 与1 - -1 相同,即1 + 1

【讨论】:

  • +1 表示“对字符串使用数学运算时,字符串将尝试转换为数字。”说真的,我不知道。
  • 但是当一个或多个字符串是操作数时,JavaScript 将 + 运算符解释为连接而不是数学运算,因此并非在所有情况下都如此。
  • @Kyle 是的,那不是真的。
  • 是的。那是正确的。又一头雾水。这是一种奇怪的行为吗?
【解决方案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 中如此奇怪,但减法转换为数字(因为减去字符串没有意义。)

【讨论】:

    【解决方案3】:

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

     1 - - 1  ==  1  +  1   // true
    "1"- -"1" == "1" + "1"  // false
    

    【讨论】:

      【解决方案4】:
      "1" - - "1" //as "-" is an arithmetic operator
      (numeric equivalent of "1"-> parseInt( "1", 10 )) - - ( numeric equivalent of "1" )
      = 1 - - 1
      = 1 - (-1)
      = 2
      

      【讨论】:

        【解决方案5】:

        这是 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 似乎将 - 运算符绑定为一元负数,这会在进行计算之前将字符串强制转换为数字类型(这具有添加在字符串)。

        【讨论】:

        • 您还应该提到相反的情况,将字符串转换为数值(这就是这里发生的事情)。
        • 确实如此,谢谢。我不确定引用页面是否完全支持相反的情况,但我认为它对手头的问题提供了一个公平的解释。
        【解决方案6】:

        取1,取-1,同加1。

        换句话说

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

        【讨论】:

          【解决方案7】:

          发生这种情况是因为双重否定是肯定的(short video explanation、long explanation、logical concept of double negation)并且在隐式 data type conversion 的“帮助”下 - 在 javascript 中,我们的例子。

          所以,

          1 - - 1 // = 2
          

          但是

          1 - - - 1 // = 0, weird but it works :-)
          

          为什么?因为当对 numbers 进行操作时,每个偶数个“-”符号都会被评估为“+”,而每个奇数个“-”符号都会给出“-”。鉴于这些,在上面的第一个示例中,“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 在撰写此评论时受到伤害:-)。

          【讨论】:

            猜你喜欢
            • 2014-03-27
            • 2020-06-29
            • 2021-08-01
            • 2012-02-01
            • 2011-07-28
            • 2016-05-25
            • 2010-10-04
            • 2015-06-13
            • 2011-09-23
            相关资源
            最近更新 更多