【问题标题】:Understanding passing JS objects and return values理解传递 JS 对象和返回值
【发布时间】:2021-11-01 13:44:58
【问题描述】:

我正在研究一些 JS 代码,与其他语言相比,这对我来说没有任何意义。 首先,有一个声明的日期对象,我理解,

$ns.constant = {
    date: {}, /* Input date */
};

然后有像下面这样的函数,其中将日期传递给函数。这是我不明白的。在其他语言中,当您将变量传递给函数时,该函数会创建一个函数本地的新变量,并且该函数会作用于该局部变量。

此函数返回 date.julian。但它也添加了其他日期,例如 date.j2000 和 date.1950。在我对其他语言的理解中,这些不会被返回,因为它们是函数本地的日期对象。在我看来,为了将这些值放入日期常量中,您必须返回函数创建的整个日期对象,而不仅仅是 date.julian。或者,js只是看到那个日期被传递了,不知怎的就知道它是日期常数?

这个函数是在修改日期常量、函数的本地对象还是什么?

谢谢

$ns.julian.calc = function (date) {
    var centuries;
    var year;
    var month;
    var b = 0;
    var c;
    var e;

    year = date.year + 4800;
    if (date.year < 0) {
        year += 1;
    }

    month = date.month;
    if (month <= 2) {
        month += 12;
        year -= 1;
    }
    e = Math.floor ((306 * (month + 1)) / 10);

    centuries = Math.floor (year / 100);

    if (date.year <= 1582) {
        if (date.year == 1582) {
            if (date.month < 10) {
                b = -38;
            }
            if (date.month > 10 || date.day >= 15) {
                b = Math.floor ((centuries / 4) - centuries);
            }
        }
        else { b = -38; } 
    } else {
        b = Math.floor ((centuries / 4) - centuries);
    }
    c = Math.floor ((36525 * year) / 100);

    date.julianDate = b + c + e + date.day - 32167.5;

    date.julianTime = (3600.0 * date.hours + 60.0 * date.minutes + date.seconds) / 86400.0;

    date.julian = date.julianDate + date.julianTime;

    date.j2000 = 2000.0 + (date.julian - $const.j2000) / 365.25;
    date.b1950 = 1950.0 + (date.julian - $const.b1950) / 365.25;
    date.j1900 = 1900.0 + (date.julian - $const.j1900) / 365.25;

    return date.julian;
};

【问题讨论】:

  • JavaScript 中的对象“通过引用”传递给函数。它就像一个指向实际对象的链接,而不是它的本地副本。这是出于性能原因。查看javascript.infothese other sites 了解详情。

标签: javascript javascript-objects


【解决方案1】:

您似乎将日期“对象”传递给您的函数,然后向其中添加内容,这将使传递给该函数的原始日期也更新,而不仅仅是函数的本地日期。

在所有语言中,不仅仅是 javascript,对象和堆引用是通过引用传递的,而堆栈变量是通过值传递的(函数的本地副本)。任何语言的对象都将通过引用传递,并且您对该对象所做的任何更改也会使原始对象发生更改。

这是因为您传递的“日期”是一个指针或对内存中您正在更新内容的堆位置的引用,因此当您稍后在该函数之外再次使用“日期”时,它仍然指向到您更新内容的同一堆地址。更改堆引用上的值将反映指向同一引用的任何内容。

您可能还对不变性的工作原理感到困惑,因为您将“日期”声明为常量,但您为该日期分配了一个对象。这意味着对该堆位置(日期)的引用不能更改,因此您不能即执行date = {},因为您无法为该指针重新分配新地址,但是该对象上的值仍然可以改变,它们不是一成不变的,所以你可以做类似date.example = 'example'的事情。我不知道 JS 中的数据结构是递归不可变的,除非您使用 https://immutable-js.com/ 之类的东西。

【讨论】:

  • 谢谢!这就说得通了。真正让我感到困惑的是,首先传递一个日期变量,然后只返回 date.julian。如果没有返回值或只返回日期,我几乎知道这是被更改的常量。传递的日期和返回值让我停下来思考,等等,这是一个函数本地日期还是常量?为了我自己在 PHP 中的理智,我不会超过日期,而只是使用 global $date 之类的东西。
  • 您不需要在该函数中返回任何返回值,您可以删除返回值,它仍然可以正常工作。外面的日期仍将更新。至于 PHP,它的工作原理完全相同,如果您传递任何 DateTime 或类对象,它的工作原理都是一样的。而 PHP 和 JS 在使用日期而不将其传递给函数方面完全相同,您也可以在函数外部声明一个日期并在内部使用它,您不需要将该日期传递给函数。
  • 那是混乱的另一部分,过了那个日期。他还在 JS 代码中做一些我从未见过用任何语言做过的事情,我仍然不确定这是聪明还是疯狂,但他正在使用一个巨大的对象 ($ns.constant) 来保存所有全局变量。在 PHP 中,我希望看到类似 $this->constant->date 的内容。相反,他只是使用日期。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多