簡體   English   中英

如果調用兩次,為什么此Javascript函數不起作用?

[英]Why does this Javascript function not work if called twice?

我正在運行的Jasmine(單元?)測試適用於以下代碼的所有測試,但最后一個測試調用了Gigasecond.date()兩次,然后驗證了第二個,但失敗了。

var Gigasecond = function(date) {
    this.startDate = date;
};

Gigasecond.prototype.date = function() {
    var x = this.startDate;
    x.setSeconds(x.getSeconds() + 1000000000);
    return x;
    }

module.exports = Gigasecond; 

我想我不知道為什么會失敗。 當我登錄到控制台時,我看到日期增加了兩次,但是認為x是它自己的單獨變量,每次調用該函數時都會創建/銷毀它。 x只是對對象上實際.startDate字段的引用嗎? 是否有任何有關此工作原理的參考資料? 我環顧四周,但找不到任何適用於此代碼中發生的事情的東西。

您聲明您

認為x是它自己的單獨變量,每次調用該函數時都會創建/銷毀它。 x只是對對象上實際.startDate字段的引用嗎?

那是對的。 日期是對象,在JavaScript中,對象是通過引用而不是副本分配給變量的。 如果打算使用副本,則需要首先返回帶有new Date(dateToBeCopied.getTime())的Date對象的克隆。

在代碼中,如果要處理日期副本,則需要替換該行

var x = this.startDate; //assignment by reference

用這條線

var x = new Date(this.startDate.getTime()); //assignment by copy

下面的示例代碼演示了它是如何工作的。 日期對象dateA被分配給變量refA通過引用並到可變copyA由副本。 修改refA ,這會影響dateA ,而copyA不受影響。

 var dateA = new Date(); //assign a reference to dateA var refA = dateA; //assign a copy of dateA var copyA = new Date(dateA.getTime()); //modify refA, increment with one year refA.setFullYear(refA.getFullYear() + 1); //variable refA points to dateA, //both show the date incremented with one year console.log('+1 year: ', dateA); console.log('+1 year: ', refA); //variable copyA returns an unmodified copy, //not incremented console.log('unmodified copy: ', copyA); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM