【问题标题】:What does = +_ mean in JavaScript= +_ 在 JavaScript 中是什么意思
【发布时间】:2013-02-14 06:23:27
【问题描述】:

我想知道 = +_ 运算符在 JavaScript 中的含义。它看起来像是在做作业。

例子:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

【问题讨论】:

  • 让我想起了旧的方法运算符-->
  • 这里的+是一元运算符,操作数为_。
  • 看起来 Perl 程序员无法放弃默认变量 ;-)
  • 一个好的语法高亮会帮助你回答这个问题。
  • 你可以做笑脸x= +_+ 0;

标签: javascript operators


【解决方案1】:
r = +_;
  • + 尝试将 _ 的任何内容转换为数字。
  • _ 只是一个变量名(不是运算符),它可以是a、foo 等。

示例:

+"1"

将“1”转换为纯数字 1。

var _ = "1";
var r = +_;

r 现在是 1,而不是 "1"。

另外,根据MDN page on Arithmetic Operators:

一元加号运算符在其操作数之前并计算其 操作数,但尝试将其转换为数字,如果不是 已经。 [...] 它可以转换字符串表示的整数和 浮点数,以及非字符串值 true、false 和 null。 十进制和十六进制 ("0x"-prefixed) 格式的整数是 支持的。支持负数(虽然不支持十六进制)。如果它 无法解析特定值,它将评估为NaN。

还要注意

一元加法是将某物转换为数字的最快和首选方式

【讨论】:

  • + 真的意味着转换为一个数字,还是+_ 真的意味着0+_,在这种情况下_ 必须在添加到0 之前转换?
  • @c.cam108 - 不,它们的行为不同。一元加号将值转换为数字,但二元加号不会:+'12' === 12(结果是数字),但0 + '12' === '012'(结果是字符串)。但是请注意,0 - '12' === -12.
  • @juzerali 当然,但这不是一个好习惯。尝试使用加法;)
  • 用 perl 的默认变量 $_ 看起来很糟糕
【解决方案2】:

它不是赋值运算符。

  • _ 只是传递给函数的参数。

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • 在下一行 r = +_; + infront 将该变量 (_) 转换为数字或整数值并将其分配给变量 r

不要将其与 += 运算符混淆

【讨论】:

    【解决方案3】:

    =+实际上是两个运算符=是赋值,+和_是变量名。

    喜欢:

    i = + 5;
    or 
    j = + i;
    or 
    i = + _;
    

    我的以下代码将帮助您展示使用 =+ 将 string 转换为 int。
    示例:

    y = +'5'
    x = y +5
    alert(x);
    

    输出 10

    使用:所以这里 y 是 int 5 因为 =+
    否则:

    y = '5'
    x = y +5
    alert(x);
    

    输出 55

    _ 是一个变量。

    _ = + '5'
    x = _ + 5
    alert(x)
    

    输出 10

    此外, 知道你也可以用~ 实现同样的事情会很有趣(如果字符串是 int 字符串 (float 将舍入到 int))

    y = ~~'5'  // notice used two time ~
    x = y  + 5
    alert(x);
    

    还输出 10

    ~ 是按位 NOT :反转其操作数的位。我做了两次,幅度没有变化。

    【讨论】:

    • 我经常使用x|0将double转换为int;然而,这以及使用 '~' 有限制为数字
    • @AkiSuihkonen 是的,我相信x|0 比+ 更快。正确 ? 不错的技术:)。 (2) 我使用~ 只是为了向OP 表明+ 不仅是一个可以使用的标志(我自己使用+)。
    • 很难说——虽然有 jsperf 是人们想要衡量的。 OTOH 这两个运算符的含义完全不同。如果只需要一个数字(而不是整数)'+' 无论如何都要短一个字符。
    • 其实我只是在jsperf中测试过——'|0' 18M ops, '+' 19M ops;性能可能会因浏览器而异。 jsperf.com/strtoint
    • @AkiSuihkonen 哦,天哪,刚刚在 Firefox 中进行了 jsperf 测试,差别很大..| 快了很多。
    【解决方案4】:

    不是=+。在 JavaScript 中,+ 表示将其更改为数字。

    +'32' 返回 32。

    +'a' 返回 NaN。

    所以你可以使用isNaN()来检查是否可以改成数字。

    【讨论】:

      【解决方案5】:

      这是一个偷偷摸摸的。

      要理解的重要一点是,这里的下划线字符实际上是变量名,而不是运算符。

      前面的加号是获取下划线的正数值——即有效地将下划线变量转换为int。您可以使用parseInt() 实现相同的效果,但这里可能使用加号转换,因为它更简洁。

      这只是将等号作为标准变量赋值。

      这可能不是故意为了混淆而写的,因为经验丰富的 Javascript 程序员通常会将下划线识别为变量。但是如果你不知道那肯定是很混乱的。我当然不会那样写。在最好的情况下,我不喜欢短的无意义的变量名——如果你想在 JS 代码中使用短的变量名来节省空间,请使用缩小器;不要以短变量开头。

      【讨论】:

      • +1,因为您是这里唯一明确指出 _ 是一个变量的人。
      • @TRiG Starx 的回答怎么样,这不是 tl;dr?
      【解决方案6】:

      = +_ 会将 _ 转换为数字。

      所以

      var _ = "1",
         r = +_;
      console.log(typeof r)
      

      将输出数字。

      【讨论】:

        【解决方案7】:

        我想你的意思是r = +_;?在这种情况下,它将参数转换为Number。假设_ 是'12.3',然后+'12.3' 返回12.3。所以在引用语句中+_ 被分配给r。

        【讨论】:

          【解决方案8】:

          _ 只是一个变量名,作为函数 hexbin.radius 的参数传递,+ 将其转换为数字

          让我举一个和你的函数一样的例子。

          var hexbin = {},r  ;
          
          hexbin.radius = function(_) {
             if (!arguments.length)
                return r;
             console.log( _ , typeof _ )    
             r = +_;
             console.log( r , typeof r , isNaN(r) );   
          }
          

          并运行这个示例函数 .. 输出

          hexbin.radius("1");

          1 string
          1 number false 
          

          hexbin.radius(1);

          1 number
          1 number false
          

          hexbin.radius([]);

          [] object
          0 number false
          

          hexbin.radius('a');

          a string
          NaN number true
          

          hexbin.radius({});

          Object {} object
          NaN number true
          

          hexbin.radius(true);

          true boolean
          1 number false
          

          【讨论】:

            【解决方案9】:

            它将为左侧变量分配一个数字。

            var a=10;
            var b="asg";
            var c=+a;//return 10
            var d=-a;//return -10
            var f="10";
            
            var e=+b;
            var g=-f;
            
            console.log(e);//NAN
            console.log(g);//-10
            

            【讨论】:

            • 您在b 之前忘记了+。
            【解决方案10】:

            简单地说,+_ 等同于使用Number() 构造函数。

            事实上,它甚至适用于日期:

            var d = new Date('03/27/2014');
            console.log(Number(d)) // returns 1395903600000
            console.log(+d) // returns 1395903600000
            

            演示: http://jsfiddle.net/dirtyd77/GCLjd/


            更多信息也可以找到on MDN - Unary plus (+) section:

            一元加号运算符位于其操作数之前并计算其操作数,但如果尚未转换为数字,则尝试将其转换为数字。虽然一元否定 (-) 也可以转换非数字,但一元加法是将某物转换为数字的最快和首选方法,因为它不对数字执行任何其他操作。它可以转换整数和浮点数的字符串表示形式,以及非字符串值 true、false 和 null。支持十进制和十六进制(“0x”前缀)格式的整数。支持负数(虽然不支持十六进制)。如果它无法解析特定值,它将评估为 NaN。

            【讨论】:

              【解决方案11】:

              +_ 几乎等效 parseFloat(_) 。注意parseInt 将停在非数字字符处,例如点,而parshFloat 不会。

              经验:

                  parseFloat(2.4) = 2.4 
              vs 
                  parseInt(2.4) = 2 
              vs 
                  +"2.4" = 2.4
              

              经验:

              var _ = "3";
                  _ = +_;
              
              console.log(_); // will show an integer 3
              

              差别很小:

              【讨论】:

              • 我想在第一行你想说parseInr(_) 而不是parseFloat(_) ?
              • 不,我的意思是float,因为 parseInt 会在非数字字符处停止,而 parshFloat 不会。经验:parseFloat(2.4) = 2.4 与 parseInt(2.4) = 2.
              【解决方案12】:

              在这个表达式中:

              r = +_;
              
              • '+' 在这里充当一元运算符,尝试转换右操作数的值。它不转换操作数,而是转换评估值。所以 _ 将保持“1”,如果它原来是这样,但 r 将成为纯数字。

              考虑这些情况是否要应用 + 进行数字转换

              +"-0" // 0, not -0
              +"1" //1
              +"-1" // -1
              +"" // 0, in JS "" is converted to 0
              +null // 0, in JS null is converted to 0
              +undefined // NaN
              +"yack!" // NaN
              +"NaN" //NaN
              +"3.14" // 3.14
              
              var _ = "1"; +_;_ // "1"
              var _ = "1"; +_;!!_ //true
              var _ = "0"; +_;!!_ //true
              var _ = null; +_;!!_ //false
              

              不过,它是最快的数字转换器,如果使用的话,我几乎不建议过度使用它。 parseInt/parseFloat 是更好的可读性替代方案。

              【讨论】:

                猜你喜欢
                • 2017-06-11
                • 2015-07-15
                • 2018-07-17
                • 1970-01-01
                • 2011-04-16
                • 2011-06-20
                • 2017-03-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多