本文只是一种生活记录,建议直接看底部结论
今天在看《高程3》的时候说ECMAScript所有参数传递都是值传递,没有引用传递,即使传递的参数是引用类型。
ECMAScript中所有函数的参数都是按值传递的。
怎么去理解这句话很重要。
我当时的理解是,即使传递的参数是引用类型,形参也会自己在堆中单独开辟一块空间存放变量。
往下看的时候我意识到我错了,他所说值传递的意思是变量地址值传递,并且高程上举了一个例子来证明:
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); // 输出Nicholas
我就纳闷了,为毛这就能证明参数是值传递的?
那这样算是值传递还是引用传递?
var obj1 = {name: 'zhou'};
var obj2 = obj1;
如果这是引用传递的话,那我们把高程3上的代码改一下,改的更像我自己写的:
var person = {};
// 以下代码等同于函数setName中的操作
var obj = {};
obj.name = "Nicholas";
obj = {};
obj.name = "Greg";
alert(person.name); // 你说这里输出什么?
最后一行代码输出的肯定是'Nicholas',那意思是复制引用类型变量也是值传递咯?
我还是不解,于是我去网上搜,“JavaScript参数传递是值传递还是引用传递”,如果你去搜过你就会发现,99.999%的回答都是贴的高程3的代码,要么就是改下变量的值,我为什么这么肯定?因为声明个对象都按照高程3上的new Object()声明的,总之我声明对象都用字面量声明。
网上搜索无果,因为网上就算讲的再细,无非就是把高程3抄的更详细,没有太多自己的想法。
这时候我就有个疑问了,是不是我自己理解错了引用传递的意思了?
搜了下引用传递是啥意思:
所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
干,原来引用传递的意思是将真实值的地址直接传进去,而不是复制一个地址进去,说白了就是真的把变量本身给传进去了。
搞了那么久原来是我定义理解有误,那这样就很明了了。
直接放结论:
1. JavaScript中参数传递是值传递
2. 引用传递的意思是将变量本身的地址传递进去,而不是复制一个地址穿进去(这是值传递)
3. 复制引用类型的变量值可以理解为值传递
4. 网上太多所谓的观点以及分析无非是将书上的内容用自己的输入法打一遍
网友评论