【问题标题】:What is 1 * new Date()?什么是 1 * new Date()?
【发布时间】:2016-07-03 13:36:31
【问题描述】:

通读jQuery源代码,我遇到了以下代码行:

1 * new Date()

通过 Google 搜索,我还看到它包含在 Google Analytics sn-p 中。

谁能解释这里发生了什么,以及这条线的目的?
是不是要生成一个不再重复的随机数?

【问题讨论】:

  • Date.now() 的写法看起来很丑陋。我的猜测:向后兼容非常旧或糟糕的浏览器。
  • @RoryMcCrossan 我确实检查了它,并看到了返回的内容。但我希望找出使用此代码的目的,以及如何乘以 1*Thu Mar 17 2016 09:38:52 GMT+0000 (GMT) gives you a 1458207532096

标签: javascript date type-conversion


【解决方案1】:

new Date() 将返回一个 Date() 对象。当强制转换为字符串时,对象返回日期的 ISO 格式字符串解释:

console.log(new Date()); // = 'Thu Mar 17 2016 09:37:12 GMT+0000 (GMT)'

当强制为整数时,这将返回该日期的纪元时间戳:

console.log(1 * new Date()); // = 1458207432249

这是一个显示两种结果的示例:

var d1 = new Date();
var d2 = 1 * new Date();

console.log(d1);
console.log(d2);

请注意,强制转换为 int 会返回与 Date.now() 相同的值,但 that method 在 IE8 及更早版本中不可用。

【讨论】:

  • 然而,这行代码出现在高于 2 的 jQuery 版本中,无论如何都不支持 IE 8。它似乎是new Date().getTime() 的简写,但如果简洁很重要(实际上,它不在这里),那么+new Date() 会更短。早期版本使用-(new Date()) 或类似名称。
【解决方案2】:

您引用的代码部分是:

expando = "sizzle" + 1 * new Date(),

是不是要生成一个不再重复的随机数?

与其说是随机的,不如说是不会在主机上重复出现的(尽管如果时钟重置为较早的日期或代码在下一个时钟滴答之前再次运行,可能会在 1 到 15 毫秒之后) .

如其他答案中所述,它相当于+new Date()new Date().getTime()

但是……

还有另一种用途,就是复制日期。在 ECMAScript 2015 之前,给出:

new Date(value)

如果 value 是 Date 对象,则调用它的 toString 方法(参见 ES5 §15.9.3.2,通过调用 ToPrimitive,对于 Date 对象调用 toString,参见§8.12.8) 底部的注释,它会生成一个依赖于实现的字符串。对其进行解析以生成新日期。这在某些浏览器中存在怪癖,其中真正具有 2 位数年份的日期被转换为 20 世纪的日期(例如,71 年 5 月 21 日的日期将变为 1971 年 5 月 21 日)。

无论如何,对这些日期使用现代公历并不是一个好主意,所以它可能不会打扰太多人。这在 ECMAScript 2015 中得到了修复,因此 value 是一个日期,它首先被转换为一个数字,然后返回 time value(参见 §20.3.2.2 #3)。

当然,它只在符合 ECMAScript 2015 规范的浏览器中修复。

Firefox 似乎仍然存在于过去。使用 new Date(date) 复制日期会丢失毫秒,因此它可能仍在使用 toString 并且不包括毫秒(大多数浏览器不包括)。因此(在 Firefox 43.04 及以下版本中,显然是 fixed in version 44),在以下内容中使用 new Date(date) 进行复制会返回 false,但在兼容 ECMAScript 2015 的浏览器中(几乎任何其他比 IE 8 更现代的浏览器)它返回 true:

var x = new Date();
var y = new Date(x);
var z = new Date(+x);

document.write('Copy using <code>new Date(date)</code> keeps milliseconds: ' + (x.getTime() == y.getTime()));
document.write('<br>Copy using<code>new Date(+date)</code> keeps milliseconds: ' + (x.getTime() == z.getTime()));

【讨论】:

    【解决方案3】:

    是日期到整数的转换:

    var date = new Date();
    //conversion by + sign (without white space)
    console.log(+date); //123454545645645645
    
    //conversion by multiply 1 
    console.log(1*date); //123454545645645645
    
    //get int value without conversion
    console.log(date.getTime()); //123454545645645645
    console.log(Date.now()); //123454545645645645
    

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2014-11-26
      • 1970-01-01
      • 2017-05-25
      • 2020-11-04
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多