标签:
在 javascript 中数据类型可以分为两类:
在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问。而原始类型的值则是可以直接访问到的。
首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。但是为什么涉及到原始类型与引用类型的值时仍然有区别呢,还不就是因为内存分配时的差别。 (我对比了一下,这里和复制变量时遵循的机制完全一样的嘛,你可以简单地理解为传递参数的时候,就是把实参复制给形参的过程)
所以,如果是按引用传递的话,是把第二格中的内容(也就是变量本身)整个传递进去(就不会有第四格的存在了)。但事实是变量把它里面的值传递(复制)给了参数,让这个参数也指向原对象。因此如果在函数内部给这个参数赋值另一个对象时,这个参数就会更改它的值为新对象的内存地址指向新的对象,但此时原来的变量仍然指向原来的对象,这时候他们是相互独立的;但如果这个参数是改变对象内部的属性的话,这个改变会体现在外部,因为他们共同指向的这个对象被修改了呀!来看下面这个例子吧:(传说中的call by sharing)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
var obj1 = {
value:‘111‘
};
var obj2 = {
value:‘222‘
};
function changeStuff(obj){
obj.value = ‘333‘;
obj = obj2;
return obj.value;
}
var foo = changeStuff(obj1);
console.log(foo);// ‘222‘ 参数obj指向了新的对象obj2
console.log(obj1.value);
/* ‘333‘ obj1仍然指向原来的对象,之所以value改变了,
*是因为changeStuff里的第一条语句,这个时候obj是指向obj1的 .
*再啰嗦一句,如果是按引用传递的话,这个时候obj1.value应该是等于‘222‘的
*/
|
好了,以上就是关于这个问题的全部解释了。
各位有兴趣的话可以去了解一下call by value ,call by reference call by sharing 等函数传递的机制call by sharing
还有stackoverflow上对于函数传递的这个问题解释得相当精辟,值得一看。(下面有链接)
参考:
转载自:Fehacker
标签:
原文地址:http://www.cnblogs.com/michael-xiang/p/4534814.html