通过jQuery源代码阅读,我遇到了以下代码:
1 * new Date()
Google搜索后,我也看到它已包含在Google Analytics代码段中。
任何人都可以解释这里发生的事情,以及这条线的目的吗? 它是否生成一个不会再重复的随机数?
答案 0 :(得分:9)
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()
相同的值,但是{8}在IE8及更早版本中不可用。
答案 1 :(得分: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底部的注释),它生成一个依赖于实现的字符串。解析它以生成新日期。这在某些浏览器中有一个怪癖,其中真正有两位数年份的日期被转换为20世纪的日期(例如,5月21日的日期,71将于1971年5月21日)。
使用现代公历来表示这些日期并不是一个好主意,所以它很可能不会打扰太多人。这已在ECMAScript 2015中修复,因此 value 是一个Date,它首先转换为Number,返回time value(参见§20.3.2.2 #3)。< / p>
当然,它仅在符合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()));
&#13;
答案 2 :(得分:1)
是整数转换的日期:
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