理解JS对象传参机制及返回值:date对象传入函数修改疑问
结论
你代码里的函数确实会直接修改外部传入的原始date对象,不需要返回整个对象,新增的julian、j2000、b1950等属性都会直接同步到你最开始声明的$ns.constant.date上。
原理说明
这是JS的参数传递规则决定的,和其他部分语言的传参逻辑有差异:
- JS中所有参数都是「按值传递」,但不同类型的值传递逻辑不同:
- 数字、字符串、布尔值等原始类型传递的是值的拷贝,函数内修改参数不会影响外部变量
- 对象、数组等引用类型传递的是「指向原对象内存地址的拷贝」——也就是说函数内的
date参数和你外部的$ns.constant.date指向的是内存里完全相同的对象
- 你代码里没有给
date参数重新赋值(比如写date = {}这种操作),只是在修改该对象的属性,所以所有修改都会直接作用到原始对象上 - 补充说明:哪怕你用
const声明对象,比如const date = {},const仅限制你不能把date变量重新指向其他对象,修改、新增对象的属性是完全合法的,不会触发限制
简单验证示例
你可以跑这段小代码快速验证这个特性:
const myDate = { year: 2024, month: 5, day: 20 }; function calcJulian(date) { // 仅修改属性,不重新赋值date date.julian = 2460450.5; date.j2000 = 24.5; return date.julian; } // 调用函数,仅接收返回的julian值 const julianVal = calcJulian(myDate); // 打印原对象,能看到新增的属性 console.log(myDate.j2000); // 输出 24.5 console.log(myDate.julian); // 输出 2460450.5
内容的提问来源于stack exchange,提问作者uPrompt
相关产品推荐
相关产品推荐

