Javascript 为什么这个函数表现得很奇怪

Javascript 为什么这个函数表现得很奇怪,javascript,Javascript,我有如下JavaScript function getExpiryDate(contract) { var expiryDay; var contractType; var today = new moment(); var today1 = new moment(); var x = myFunction(4, 3); var abc =3; var xyz= 4; var c = myFunction(abc, xyz);

我有如下JavaScript

function getExpiryDate(contract) {
    var expiryDay;
    var contractType;
    var today = new moment();
    var today1 = new moment();

    var x = myFunction(4, 3);
    var abc =3;
    var xyz= 4;
    var c = myFunction(abc, xyz);

    console.log("abc is: "+abc);
    console.log("xyz is: "+xyz);
    console.log(today1);

    expiryDay = getlastDayofMonth('Thursday',today1);

    console.log(today1); /* Why has the value of today changed? */
}

function getlastDayofMonth(dayName,date1) {

    var endDate = date1.endOf('month');
    var lastDayOfMonth =  endDate.format('dddd');
    var weekDayToFind = moment().day(dayName).weekday(); //change to searched day name

    var searchDate = endDate; //now or change to any date

    while (searchDate.weekday() !== weekDayToFind)
    { 
        searchDate.subtract(1, 'days'); 
    }

    return searchDate;
}

function myFunction(a, b) {
    return a * b;                // Function returns the product of a and b
}
当我执行时,我得到以下输出

expirydate.js:11 abc is: 3
expirydate.js:12 xyz is: 4
expirydate.js:13 Moment { _d: Wed Aug 31 2016 10:21:04 GMT+0530 }
expirydate.js:15 Moment { _d: Thu Aug 25 2016 23:59:59 GMT+0530 }

我完全搞不懂为什么today1的值在函数中使用时会发生变化

因为在JS中,对象是通过引用而不是通过值传递的。这意味着你正在处理同一个对象


为了防止这种情况,您必须将函数中的date1值克隆到一个变量中,该变量的作用域仅限于函数

,因为在JS中,对象是通过引用而不是通过值传递的。这意味着你正在处理同一个对象


为了防止出现这种情况,您必须将函数中的date1值克隆到一个变量中,该变量的作用域仅限于函数

这是因为矩是以可变的代码样式编写的。这是相当令人惊讶的行为。在阅读了您的代码几次之后,我没有发现任何明显的问题,直到我查看了文档

该方法会更改日期,即更改调用它的时刻对象的日期:

通过将原始力矩设置为一个时间单位的末尾来对其进行变异

因此,当您在此处调用该方法时:

var endDate = date1.endOf('month');
它正在变异
date1
,这意味着它修改了
date1
,并改变了它的时间。事实上,几乎所有的矩方法都会改变矩对象。关于API设计拙劣的原因有很多疑问

就解决你的具体问题而言,这是个人的风格偏好。我认为在将对象传递给函数之前强制用户克隆对象是不可取的。因此,我将克隆函数中传递的时刻:

function getlastDayofMonth(dayName,date1) {

    var endDate = date1.clone().endOf('month');

之所以会发生这种情况,是因为Moment是以可变的代码风格编写的。这是相当令人惊讶的行为。在阅读了您的代码几次之后,我没有发现任何明显的问题,直到我查看了文档

该方法会更改日期,即更改调用它的时刻对象的日期:

通过将原始力矩设置为一个时间单位的末尾来对其进行变异

因此,当您在此处调用该方法时:

var endDate = date1.endOf('month');
它正在变异
date1
,这意味着它修改了
date1
,并改变了它的时间。事实上,几乎所有的矩方法都会改变矩对象。关于API设计拙劣的原因有很多疑问

就解决你的具体问题而言,这是个人的风格偏好。我认为在将对象传递给函数之前强制用户克隆对象是不可取的。因此,我将克隆函数中传递的时刻:

function getlastDayofMonth(dayName,date1) {

    var endDate = date1.clone().endOf('month');

如果你只是做
moment()
而不是
new moment()
,你会得到同样的结果吗?如果你做一些好的缩进,你会有更大的机会让你的代码被阅读。美化代码如果你只是做
moment()
而不是
new moment(),你会得到同样的结果吗
?通过一些漂亮的缩进,您将有更大的机会阅读代码。美化代码在JavaScript中所有内容都是按值传递的(即使它是指向可变对象的引用值)。没有指针或共享变量。对象通过引用传递。对象是引用值,因此您正在传递引用,是的,但不是,参数将不是对作为参数传递的变量的引用(这就是“通过引用传递”通常的含义)。谢谢,我编辑了我的答案以澄清问题。问题是他正在研究同一个目标。同意@Sylwit;在JS中,运算符“=”将指针复制到数组的内存区域。如果要将一个阵列复制到另一个阵列中,则必须使用克隆功能。$。克隆(对象)JavaScript中的所有内容都是通过值传递的(即使它是指向可变对象的引用值)。没有指针或共享变量。对象通过引用传递。对象是引用值,因此您正在传递引用,是的,但不是,参数将不是对作为参数传递的变量的引用(这就是“通过引用传递”通常的含义)。谢谢,我编辑了我的答案以澄清问题。问题是他正在研究同一个目标。同意@Sylwit;在JS中,运算符“=”将指针复制到数组的内存区域。如果要将一个阵列复制到另一个阵列中,则必须使用克隆功能。$。克隆(对象)