结论:javascript是按值传递的
1.基本类型的按值传递
javascript的基本类型传递的意思就是把变量的【值】拷贝一份传递过去,但是当前变量本身不改变。
效果:对变量的修改【不会影响到原来的变量的值
】。
基本数据类型包括:Number、String 、Boolean、Null和Undefined
举例如下:
var value = 1;
function foo(v) {
v = 2;
console.log(v);
}
foo(value);
console.log(value);
输出结果:
2
1
2.引用类型的按值传递:修改对象属性
引用类型按值传递的意思就是把当前对象的引用值
拷贝一份传递过去(原对象和函数变量的引用都指向同一个引用),所以对对象属性
的修改就会保留下来,引用类型之所以传递的是对象引用值的拷贝是因为因为当值是一个复杂的数据结构的时候,拷贝就会产生性能上的问题。
效果:对引用类型【属性的修改会反映到原来对象上
】。
举例如下:
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value);
}
foo(obj);
console.log(obj.value);
输出结果:
2
2
3.引用类型的按值传递:修改函数参数的引用
引用类型按值传递:传递的还是当前对象的【引用值】拷贝。
这个时候,如果直接修改函数变量的引用,其实修改的是哪个拷贝的引用,当然对原对象没有任何影响了。
效果:对参数的直接修改(引用修改)【对原来对象没有任何影响
】。
举例如下:
var obj = {
value: 1
};
function foo(o) {
o =2;
console.log(o);
}
foo(obj);
console.log(obj);
console.log(obj.value)
输出结果:
2
1
总结:javascript是按值传递的
区别在于基本类型
传递的是具体值的拷贝
,而引用类型
传递的是引用值的拷贝
,对于对引用传递的修改会不会影响到原来对象的属性,就看在函数中修改的是引用本身
(仅仅是参数引用指向另一个地址而已,所以对原对象没有任何影响,这里关键要理解:原对象的引用、和参数的引用其实是两个完全独立的引用
(或者说是指针),他们的共同点就是指向到相同的内存地址而已),还是修改的引用值的属性
(修改参数引用的属性会影响到原对象的属性
)。
其实不仅是javascript,java也是这样的传值方式,其他编程语言相信也是这样的传值方式。