代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

javascript指针和日期

  •  1
  • Matt Anxo P  · 技术社区  · 14 年前

    我在代码中注意到了这种情况(很不幸),并且能够在我自己的JS文件中复制它。所以我有这个代码:

    var date1 = new Date();  // today
    var date2 = date1;
    
    date2 = date2.setDate(date2.getDate() + 1);
    // what is date1?
    

    执行此代码后, DATE1 是今天的日期+1!这可以追溯到我上大学的时候,我学过指针,我想我有点生疏了。这就是这里发生的事吗?显然,我已经将任务从date1移走了,并且只修改了date2,但是date1正在被更改。为什么会这样?

    顺便说一句,在代码执行之后,date2是一个很长的数字,如1272123003911。我假设这是日期中的秒数,但是date2不应该仍然是日期对象吗?setDate()应返回日期对象。

    4 回复  |  直到 10 年前
        1
  •  4
  •   Justin Niessner    14 年前

    重读类型与值类型的典型情况。

    当赋值运算符工作时 基元值(数字、字符串、 布尔值、空值和未定义的),副本 价值的价值。当 分配操作员工作 javascript对象,对 对象被复制。

    Assignment by Value Versus Assignment by Reference

    因此:

    // creates a new Date object in memory with date1 as a Reference to its location
    var date1 = new Date();
    
    // date2 will now point to the same Object in memory as date1
    var date2 = date1;
    
    // Since both date1 and date2 point to the same object,
    // modifying one changes the other
    date2 = date2.setDate(date2.getDate() + 1);
    

    对于结果值,您是正确的。它在表达式内部被转换为自epoch以来的秒数。

        2
  •  3
  •   Christian C. Salvadó    14 年前

    你的变量 date1 date2 指向同一对象。

    这就是为什么当你执行 setDate DATE2 变量,您可以看到 DATE1 ,因为实际上这两个变量指向完全相同的对象。

        _____             ____________
       |date1| --------->| new Date();|
        ¯¯¯¯¯             ¯¯¯¯¯^¯¯¯¯¯¯
        _____                  |
       |date2| -----------------
        ¯¯¯¯¯ 
    
    

    这个 设置当前日期 方法返回 valueOf 这个 Date 对象,它是一个数字表示形式,从1970年1月1日UTC到您的日期之间的毫秒数。

        3
  •  1
  •   Pointy    14 年前
    • 两个变量都引用同一个对象,并且 setDate() 调用实际上改变了对象本身(换句话说,它不仅仅是复制原始对象并返回新对象)。
    • 当您在表达式中使用日期对象时,它可能最终被转换为一个数字,即(如您所说)自纪元以来的秒数。
        4
  •  1
  •   T.J. Crowder    14 年前

    此代码:

    var date1 = new Date();  // today
    var date2 = date1;
    

    …创造 日期对象,它有两个引用。由于这两个变量都指向同一个对象,因此使用任一变量都可以看到对该对象的任何更改。他们都指向同一件事。存储在变量中的对象是对对象的引用,而不是实际对象。

    最好的思考方法是变量包含值。完全停止。对于像(比如)数字5这样的原语,变量持有的值就是值。对于对象引用,变量持有的值是对对象的引用(指向对象的指针),而不是实际对象。据我们所知,这个引用是数字77314,它是包含实际对象数据的某个查找表的索引。我们不知道(或不关心),它只是一个让我们找到目标的价值。

    在这两种情况下,赋值、将值传递到函数等所发生的事情的规则是相同的-值是值。所以:

    var n1, n2;
    
    n1 = 5;  // n1 has the value 5
    n2 = n1; // n2 now also has the value 5
    

    还有:

    var d1, d2;
    
    d1 = new Date(); // d1 has a value that references the new Date object
    d2 = d1;         // d2 now also has that value, which references that object
    

    当您更改对象的属性时,它对对象的引用没有任何影响。对象的属性属于对象,而不是对象的引用。因此,由于这两个变量指向(引用)同一个事物,如果使用其中一个变量更改该事物,那么如果使用另一个变量查询对象,就会看到更改。