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

Ran*_*lue 18 javascript datetime date node.js

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

o.a === o.b永远true?(我最感兴趣的是Node.JS.)

ssu*_*ube 21

没有.

在我们进入规范所说的内容之前,Date.now可以在运行时用用户定义的函数替换.这适用于Node和浏览器:

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

有了它,每次调用至少需要一秒钟,所以你的两个调用永远不会相等.

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

指定现在发生呼叫的UTC日期和时间的时间值

它不能保证两次调用返回相同的值.据我所知,规范指定Date对象具有毫秒精度(15.9.1.1)但不保证准确性.

由于底层计时器不精确而且两者在同一刻度内发生,因此同一行中的两个调用可能会返回相同的时间,但规范似乎没有指定.

  • @ssube有趣的例子表明,Date.now也可以在运行时用户定义的函数,它总是返回相同的值,在这种情况下,声明将永远是真正的替换.开玩笑当然...... (4认同)

Sup*_*rac 9

不,试试这个简单的测试:

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 !=');
  }
}
Run Code Online (Sandbox Code Playgroud)

你会看到会发生什么!


fam*_*kin 5

即使两者可能总是相同的一些JS-engine-implementation-wise,逻辑上它是两个不同的时间瞬间,这就是我对待它们的方式.