如何理解函数的参数都是按值传递的

这个问题的起源源于我的怀疑精神。。

一开始我怀疑尼古拉在js高级教程中的关于“函数的参数都是按值传递的“说法是错误的。

为此我根据他的证明代码做过如下变换:
var person = new Object();
var obj = person;
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
alert(person.name); // "Nicholas"

因为我开始坚定不移的认为上述代码应该是按引用传递的,那么尼古拉的证明就不对。结果我查找发现:


上述代码本身就是按值传递的!!!这让我非常受伤,感觉身体被掏空。。

分割线——————————————

科普一下js中传递数据的方式:
1,.按值传递,分为两类,基本类型值的传递和函数参数的传递,而函数参数的传递又有两种,基本类型值的参数传递和引用类型值的参数传递。

其中,引用类型值的传递实际上传递的对象的引用(引用=内存中的地址=值),而不是传递的对象本身,

因为执行的操作是复制保存操作(这一点可以看js高级教程68页的下面的注释)。


2.按引用传递则很好理解,传递的是完整的对象本身。
分割线—— —— —— —— —— ——


回到我开始假设的代码,因为 var obj = person;这个操作是复制保存操作,所以执行按值传递,假设本身就是错的!因此,它就没有任何存在的必要了,哪来哪去吧-。-


接着,我们来看看尼古拉写的这个证明对象在函数的参数传递中是按值传递的代码:
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}

var person = new Object();
setName(person);
alert(person.name); // "Nicholas"
var person = new Object();
setName(person);
alert(person.name); // "Nicholas"
可以看到,如果对象在函数的参数传递中是按引用传递的,那么当解析器执行到:
obj = new Object();
这段代码的时候,person原先指向的那个对象将被删除,即obj和person都
将指向新建的obj对象,而新建的obj对象的name属性时“Greg”,则弹出的应该是“Greg”,而结果却不是,说明:

对象在函数的参数传递中是按值传递!

 小伙伴们都理解了吗?

posted @ 2016-10-10 17:47  呆呆de地瓜  阅读(1364)  评论(1编辑  收藏  举报