在函数内部操纵函数参数是一个好的编程实践吗?

6
在良好的JavaScript实践中,从函数内部修改引用值类型(Object)的函数参数是否被普遍接受(或者被反对)?
我知道所有函数参数都是按值传递的,并且引用值参数只是指向对象内存位置的指针。
谢谢!
编辑:我已经从标题和描述中删除了“按引用传递”,以使措辞更加准确,并避免读者混淆。正确答案(和有帮助的评论)仍然适用。

4
“按引用传递”并不是指那个意思。无论如何,假设你的系统架构支持,操作对象的内容是完全可以的,这没问题。 - Pointy
1个回答

5

您似乎知道JavaScript中没有传递引用,因此我无法想象“像它一样处理它”会是什么样子。请记住,由于JavaScript中没有传递引用,这意味着您不能从函数中访问并更改传入值的变量(而不是它所引用的对象)。这既不是好的做法也不是坏的做法;这是不可能的。

function foo(a) {
   a  = {"different stuff": "here"};
}
var b = {stuff: "here"};
foo(b);               // `foo`'s assignment to `a` has nothing whatsoever
                      // to do with `b` and has no effect on it
console.log(b.stuff); // "here"

一般来说,如果你想要修改一个对象的状态,通过按值传递到函数中的对象引用进行修改是完全可以接受的:

function foo(a) {
   a.stuff = a.stuff.toUpperCase();
}
var b = {stuff: "here"};
foo(b);
console.log(b.stuff); // "HERE"

这与按引用传递完全无关。

有些编程范式在JavaScript中有时会使用,这种情况下克隆并返回一个新对象是不可以的。但这不是JavaScript中的常规做法,如果你在使用它们,你会知道的。如果你没有使用它们,修改对象状态是标准做法。


一般来说,如果您的问题是这样的,通过传递(按值)到函数中的对象引用来修改对象的状态是完全可以接受的。是的,实践中这是一种可接受的技术吗? - Dave
1
@Dave:除非你是在进行 hardcore functional programming,否则不需要用 JavaScript。绝大多数人都不需要。不过,JavaScript 中有一个更大的“函数式编程社区”,比其他非函数式设计的语言(如 Haskell)要大得多。虽然从百分比上来看并不算多,但是他们确实存在。不过,如果你在使用函数式编程,你就会知道了。 :-) - T.J. Crowder
1
同时,感谢您明确指出 JavaScript 中只有按值传递的特性。 - Dave
哈哈,肯定不是功能性的,但我正在以一种不太常见的方式编写JavaScript。这是一个关键字驱动的自动化测试框架,使用Sahi Pro允许我们的QA团队编写自动化测试。在编写框架的同时,我正在阅读两本书,Web开发专业JavaScriptJavaScript语言精粹,它们都是非常好的读物。 - Dave
3
@Dave:关于第二个问题,我想提醒你要小心。Crockford是一个聪明、博学的人,但在他的写作中,有时他未能区分他的观点和事实。例如,在《JavaScript语言精粹》中,有一些有关构造函数(他不喜欢)继承部分的错误信息。只要记住这一点,阅读Crockford的书仍然是非常值得的。 :-) 另外,我想指出的是,自从写了那本书之后,他已经朝着更加函数式的方向发展,所以如果你读一些他最近的作品,你会看到这种影响。祝好! - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接