两个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的初级读本
以下是一些特定于节点的信息: 节点时间
没有。
你的问题暗示了两个问题:
-
对象初始值设定项有什么特别的地方,它会查看属性初始值设定项的值并“优化”它们或某些内容以避免多余的调用?
-
如果连续快速调用两次,
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>