Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一个对象声明中的两个Date.now()_Javascript_Node.js_Date_Datetime - Fatal编程技术网

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

Javascript 一个对象声明中的两个Date.now(),javascript,node.js,date,datetime,Javascript,Node.js,Date,Datetime,让var o={a:Date.now(),b:Date.now()} 是否o.a===o.b始终true?(我最感兴趣的是Node.JS。)即使这两者在某些JS引擎实现方面可能总是相等的,但从逻辑上讲,这是两个不同的时间点,我会这样对待它们。不 在我们深入了解规范可能会说什么之前,Date.now可以在运行时用用户定义的函数替换。这适用于节点和浏览器: let oldNow = Date.now; Date.now = function () { let wait = oldNow() +

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


是否
o.a===o.b
始终
true
?(我最感兴趣的是Node.JS。)

即使这两者在某些JS引擎实现方面可能总是相等的,但从逻辑上讲,这是两个不同的时间点,我会这样对待它们。

在我们深入了解规范可能会说什么之前,
Date.now
可以在运行时用用户定义的函数替换。这适用于节点和浏览器:

let oldNow = Date.now;
Date.now = function () {
  let wait = oldNow() + 1000;
  while (oldNow() < wait) {
    // wait one second
  }
  return oldNow();
}
让oldNow=Date.now;
Date.now=函数(){
让我们等待=oldNow()+1000;
while(oldNow()
这样,每次调用至少需要一秒钟,因此您的两次调用永远不会相等

当我们看到它时,它只是说它回来了

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

它不保证两个调用返回相同的值。据我所知,但不能保证准确性


同一行中的两个调用很可能返回相同的时间,因为底层计时器不精确,并且两个调用发生在同一个刻度内,但规范似乎没有指定该时间。

如果您对精度感兴趣,我建议使用performance.now()。如果需要它们相同,我建议为对象编写一个构造函数,然后将Date.now()赋给一个临时变量,然后将该值赋给a和b

下面是API的入门介绍


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

否,请尝试以下简单测试:

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 !=');
  }
}
var test=newarray();
对于(var i=0;iNo

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

  • 对象初始值设定项查看属性初始值设定项值并“优化”它们,或者避免重复调用,这有什么特别之处吗

  • Date.now
    快速连续调用两次时始终返回相同的值

  • 答案是否定的,否定的:-)让我们更详细地看一下:

    对象初始值设定项 对象初始值设定项是逐步处理的。这在规范()中有详细说明,虽然在之前的第5版规范中,这是一个更容易理解的部分,但它基本上表示创建了对象,然后按源代码顺序将属性添加到对象中,一次添加一个。因此:

    var o = {
        a: "one",
        b: "two"
    };
    
    首先,JavaScript引擎创建对象,然后计算
    a
    “one”
    )的属性初始值设定项的右侧,将
    a
    属性与结果值相加,然后计算
    b
    “two”
    )的属性初始值设定项的右侧,然后将
    b
    属性与结果值相加。因此,我们知道,右手边是单独评估的,在评估过程中的不同时刻。这就是为什么:

    var value = 0;
    function unique() {
        return value++;
    }
    var o = {
       a: unique(),
       b: unique()
    };
    
    var值=0;
    函数唯一(){
    返回值++;
    }
    变量o={
    a:唯一(),
    b:唯一的()
    };
    log(“o.a=“+o.a+”,o.b=“+o.b”)
    
    
    
    使用
    performance.now()
    我可以得到两个不同的值!谢谢。啊,从你的问题来看,不清楚目的是让他们有所不同还是确定他们是相同的。很高兴我能帮上忙。这不会阻止事件循环一秒钟吗?@是的。这是一个简单的证明,
    Date.now
    可能返回两个不同的值(尽管有一段时间,Omniture中使用了一些非常相似的代码,并导致了许多问题)。@ssube有趣的是,您的示例显示了该日期。now还可以在运行时替换为用户定义的函数,该函数始终返回相同的值,在这种情况下,这种说法总是正确的。当然只是开玩笑。。。