从函数内部操作函数参数是一种好习惯吗?

Dav*_*ave 5 javascript

在良好的 JavaScript 实践中,从函数内部修改类型引用值 (Object) 的函数参数是否通常可以接受(或不赞成)?

我知道它是如何工作的,因为所有函数参数都是按值传递的,而参考值参数只是一个指向对象内存位置的指针。

谢谢!

编辑:我从标题和描述中删除了“通过引用传递”,以使措辞更正确并避免读者混淆。正确答案(和有用的评论)仍然适用

T.J*_*der 5

你似乎知道它不是通过引用传递的,所以我无法想象像它那样“对待它”会是什么样子。请记住,因为 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"
Run Code Online (Sandbox Code Playgroud)

通常,如果您要问的是,通过(按值)传递给函数的对象引用来修改对象的状态是完全可以接受的:

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

这与传递引用完全没有关系。

有一些编程范式,其中一些有时会在 JavaScript 中使用,在这种情况下,这是不行的,您必须克隆并返回一个新对象。这些不是JavaScript 中的规范,如果您使用它们,您就会知道。如果不是,那么像这样修改对象状态是标准做法。

  • @Dave:只是对第二个警告说一句。克罗克福德是一个聪明、见多识广的人,但在他的写作中,他有时无法区分他的观点和事实。例如,在 *The Good Parts* 的继承部分中有一些关于构造函数的完全错误的信息(他不喜欢)。Crockford 非常值得一读,只要您牢记这一点。:-) 另外,我会注意到,自从写那本书以来,他转向了一个更实用的方向,所以如果你阅读他最近的一些作品,你会看到这种影响。最好的事物, (3认同)