JavaScript函数的值传递
截取自 高程四 -> 第四章 -> 4.1.4
看完有没有迷迷糊糊的呢~
什么是值传递,什么是引用传递?
在讨论js的对象值传递之前还是先明确一下什么是引用传递什么是值传递吧,js中没有引用传递这里用c++展示一下什么事引用传递。
什么是引用传递?
值传递
看下边这段js代码,如果是引用传递,则num的值会在fn执行后变为20。
function fn(val) {
val = 20;
}
let num = 10;
fn(num);
console.log(num); // print 10
什么是引用传递
js中没有引用传递,看下边这段c++代码,一个基本的int类型传递给一个函数在这个函数内修改了这个值,外界的num也发生了变更,或者说是fn直接修改了num,这就是引用传递,在js中是不可能对基本类型这种操作的。
#include <iostream>
using namespace std;
int fn(int &val)
{
val = 20;
return 0;
}
int main()
{
int num = 10;
fn(num);
cout << num << endl; // print 20
return 0;
}
为什么js对象传递值就变了?
或许是就没搞懂过引用传递的概念
function setName(obj) {
obj.name = "Nicholas";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"
直观感受上obj如果是值传递则里边修改了不应该对外界造成影响,但这里给obj加上了一个name属性。
当把这个obj重新赋值给一个新的值则再修改外界没了反应,如果是引用传递的,外界也应该被修改,参考上边那段c++代码。
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"