我的两分钱....JavaScript是通过引用还是值传递参数无关紧要。真正重要的是赋值还是变异。
我在这个链接里写了一个更长的,更详细的解释。
当你传递任何东西(无论是一个对象还是一个原语)时,JavaScript所做的只是在函数内部分配一个新变量……就像使用等号(=)一样。
这个参数在函数内部的行为和你用等号赋值一个新变量的行为是完全一样的。举几个简单的例子。
var myString = '测试字符串1';
//赋值-指向myString相同位置的链接
var sameString = myString;
//如果我改变了sameString, myString将不会改变,
//它只是重新赋值给一个全新的字符串
sameString = '新字符串';
console.log (myString);//记录'测试字符串1';
console.log (sameString);//记录'新字符串';
如果我将myString作为参数传递给一个函数,它的行为就好像我简单地将它赋给了一个新变量。现在,让我们做同样的事情,但是用一个函数而不是简单的赋值
函数myFunc(sameString) {
/ /重置手术……同样,它不会修改myString
sameString = '新字符串';
}
var myString = '测试字符串1';
//它的行为与sameString = myString相同
myFunc (myString);
console.log (myString);//再次,日志'测试字符串1';
当你将对象传递给函数时,你可以修改对象的唯一原因是你没有重新赋值…相反,对象可以更改或突变....同样,它的工作方式是一样的。
var myObject = { name: 'Joe'; }
// Assignment - We simply link to the same object
var sameObject = myObject;
// This time, we can mutate it. So a change to myObject affects sameObject and visa versa
myObject.name = 'Jack';
console.log(sameObject.name); // Logs 'Jack'
sameObject.name = 'Jill';
console.log(myObject.name); // Logs 'Jill'
// If we re-assign it, the link is lost
sameObject = { name: 'Howard' };
console.log(myObject.name); // Logs 'Jill'
如果我将myObject作为参数传递给一个函数,它的行为就好像我简单地将它赋给了一个新变量。同样的事情,同样的行为,但是是一个函数。
函数myFunc(sameObject) {
//我们改变了对象,所以myObject也得到了改变…就像以前一样。
sameObject.name = 'Jill';
//但是,如果我们重新分配它,链接就丢失了
sameObject = {
名称:“霍华德”
};
}
var myObject = {
名称:“乔”
};
//这就像我们说sameObject = myObject一样;
myFunc (myObject);
console.log (myObject.name);//日志'Jill'
每次将变量传递给函数时,你都是在“赋值”给参数的名称,就像使用等号一样。
永远记住等号=表示赋值。
将参数传递给函数也意味着赋值。
它们是相同的两个变量以完全相同的方式连接在一起。
修改一个变量影响另一个变量的唯一情况是底层对象发生变化。
区分对象和原语是没有意义的,因为它的工作方式就像你没有一个函数,只是用等号赋值给一个新变量一样。