【问题标题】:What does the plus sign do in '+new Date''+new Date' 中的加号有什么作用
【发布时间】:2010-09-18 07:17:37
【问题描述】:

我在几个places看到过这个

function fn() {
    return +new Date;
}

我可以看到它返回的是时间戳而不是日期对象,但我找不到任何关于加号在做什么的文档。

谁能解释一下?

【问题讨论】:

标签: javascript syntax


【解决方案1】:

那是+一元运算符,相当于:

function(){ return Number(new Date); }

见: http://xkr.us/articles/javascript/unary-add/

在 MDN 中:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus

【讨论】:

  • 但是你为什么不在日期对象上使用定义的getTime 方法呢?!
  • 几乎在任何情况下您都不应该实际使用它。我真的被这件事烧死了。 +new Date() 除了任何类型的数学运算之外,都会遭受重大的性能损失。看看这个jsperf,jsperf.com/new-date-timing
  • @BradKoch 编程简洁肯定不是灵魂的智慧。正如 python 社区所说的那样,“显式总是比隐式好”。如果浏览器通过回归更改了其中隐含的自动类型转换怎么办?现在您的代码不起作用! .getTime() 将始终确保它确实如此。
  • @Geui 是另一个很好的理由,因为你可以并不意味着你应该!
  • Sine ECMAScript 5 中有Date.now(),这是获取日期和时间(以毫秒为单位)的首选方式。
【解决方案2】:

JavaScript 是松散类型的,因此它会在某些情况下执行类型强制/转换:

http://blog.jeremymartin.name/2008/03/understanding-loose-typing-in.html
http://www.jibbering.com/faq/faq_notes/type_convert.html

其他例子:

>>> +new Date()
1224589625406
>>> +"3"
3
>>> +true
1
>>> 3 == "3"
true

【讨论】:

  • >>> 3 === "3" 假
【解决方案3】:

这里是关于“一元加法”运算符的specification。希望对你有帮助...

【讨论】:

    【解决方案4】:

    JavaScript 日期可以写成字符串:

    2015 年 9 月 10 日星期四 12:02:54 GMT+0530 (IST)

    或作为数字:

    1441866774938

    日期写成数字,指定自 1970 年 1 月 1 日 00:00:00 以来的毫秒数。

    在回答您的问题时,它通过在赋值运算符 '=' 之后添加 '+' 来将 Date 转换为相等的数值。

    同样可以使用 Number() 函数来实现,比如 Number(new Date());

    var date = +new Date(); //same as 'var date =number(new Date());'
    

    【讨论】:

      【解决方案5】:

      只是为了提供更多信息:

      如果你还记得,当你想找到两个日期之间的时间差时,你只需执行以下操作;

      var d1 = new Date("2000/01/01 00:00:00"); 
      var d2 = new Date("2000/01/01 00:00:01");  //one second later
      
      var t = d2 - d1; //will be 1000 (msec) = 1 sec
      
      typeof t; // "number"
      

      现在如果你检查 d1-0 的类型,它也是一个数字:

      t = new Date() - 0; //numeric value of Date: number of msec's since 1 Jan 1970.
      typeof t; // "number"
      

      那个 + 也会将日期转换为数字:

      typeof (+new Date()) //"number"
      

      但请注意,0 + new Date()不会受到类似对待!它将被连接为字符串:

      0 + new Date() // "0Tue Oct 16 05:03:24 PDT 2018"
      

      【讨论】:

        【解决方案6】:

        它是一个一元加法运算符,也用于显式数字转换,所以当你调用+new Date()时,它会尝试使用valueOf()获取该对象的数值,就像我们得到字符串一样来自toString()

        new Date().valueOf() == (+new Date)  // true
        

        【讨论】:

          【解决方案7】:

          它的作用完全一样:

          function(){ 返回 0+新日期; }

          与以下结果相同:

          function(){ return new Date().getTime(); }

          【讨论】:

          • 在 0+新日期没有。这首先将日期转换为字符串,然后在前面加上“0”,(例如:“0Tue Oct 21 2008 20:38:05 GMT-0400”);
          • 1 * new Date 会,但是 1 + new Date --> String
          • 是的,new Date/1也一样
          猜你喜欢
          • 2017-06-18
          • 2014-11-26
          • 2016-07-03
          • 1970-01-01
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多