两个Date.now()在一个对象声明中

var o = {a:Date.now(), b:Date.now()}

oa === ob总是true吗? (我主要对Node.JS感兴趣)

没有。

在我们进入规范之前, Date.now可以在运行时被用户定义的函数replace。 这适用于Node和浏览器:

 let oldNow = Date.now; Date.now = function () { let wait = oldNow() + 1000; while (oldNow() < wait) { // wait one second } return oldNow(); } 

那么,每个调用至less需要一秒,所以你的两个调用永远不会相等。

当我们查看Date.now (15.9.4.4)的规范时 ,它只是说它返回

指定现在呼叫发生的UTCdate和时间的时间值

这不会保证两次调用返回相同的值。 从我可以告诉, 规范指定Date对象将具有毫秒精度(15.9.1.1),但不能保证准确性。

同一行中的两个调用可能会同时返回,这是由于底层定时器不精确,而且两个调用在同一个tick中,但是规范似乎没有指定。

不,试试这个简单的testing:

 var test = new Array(); for(var i=0; i<40000; i++){ test.push({a:Date.now(), b:Date.now()}); } for(var i=0 ; i<test.length; i++){ if(test[i].a != test[i].b){ console.warn('a & b !='); } } 

你会看到发生了什么!

即使这两者可能总是相同的,但是从逻辑上讲,这是两个不同的时间,我就是这样对待它们的。

如果你对精度感兴趣,我会build议performance.now()。 如果你需要它们是相同的,我会build议为对象编写一个构造函数,然后将Date.now()赋值给一个临时variables,然后将该值赋值给a和b。

这里是API 发现人力资源时间API的初级读本

以下是一些特定于节点的信息: 节点时间

没有。

你的问题暗示了两个问题:

  1. 对象初始值设定项有什么特别的地方,它会查看属性初始值设定项的值并“优化”它们或某些内容以避免多余的调用?

  2. 如果连续快速调用两次, Date.now始终返回相同的值吗?

答案是否定的,不是。 :-)让我们来看看更多细节:

对象初始化器

对象初始值设定项是一步一步处理的。 这在规范中有详细的描述( 从这里开始 ),虽然在以前的第5版规范中容易理解,但它基本上说是创build了对象,然后以源代码的顺序添加了属性,一次。 所以:

 var o = { a: "one", b: "two" }; 

首先,JavaScript引擎创build对象,然后评估属性初始值设定项的右边( "one" ),添加a带有结果值a属性,然后评估属性初始值设定项的右边的b"two" ),然后添加结果值的b属性。 所以我们知道,右边是分开评估的,在这个过程的不同时刻。 这就是为什么这个:

 var value = 0; function unique() { return value++; } var o = { a: unique(), b: unique() }; 
 var value = 0; function unique() { return value++; } var o = { a: unique(), b: unique() }; snippet.log("oa = " + oa + ", ob = " + ob); 
 <!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>