美文网首页
JS中函数参数值传递和引用传递

JS中函数参数值传递和引用传递

作者: D_R_M | 来源:发表于2019-01-05 19:11 被阅读15次

一.函数传递基本类型:

function fn(val)
{ 
 val+=10; 
 return val; 
} 
var val=10; 
var result=fn(val); 
console.log(val);//10
console.log(result);//20

从上面代码执行得到的结果10,20可以看出val在传递给函数的形参的时候是拷贝了一个副本传递进去,函数内部对val进行修改是不会影响到外部的val。

基本类型是按值传递


二.函数传递引用类型:

function fn(obj)
{ 
  obj.name="Annie"; 
} 
var obj=new Object(); 
obj.name="jake";
fn(obj); 
console.log(obj.name);//Annie

上面代码打印结果Annie,表面上看上去这就是一种典型的按引用传递,实则也是按值传递(此处值是内存地址的副本)。
换个方式:

function fn(obj)
{ 
  obj=new Object(); 
  obj.name="Annie"; 
} 
var obj=new Object(); 
obj.name="jack"; 
fn(obj); 
console.log(obj.name);//jack

如果引用类型按引用传递的话,那么为什么结果会打印出 jack 呢?
查阅网上资料发现有人称js是按共享传递,那么共享传递是什么呢?


三.用共享传递的方式理解
所谓共享传递其实就是在内存栈中复制出一份相同的值(不同地址的内存空间),传递给函数。
按共享传递方式传递(基本类型):(引用上面的代码)

function fn(val)
{ 
 val+=10; 
 return val; 
} 
var val=10; 
var result=fn(val); 
console.log(val);//10
console.log(result);//20
image.png

此处的val2 是js自动完成的拷贝。

按共享传递方式传递(引用类型):(引用上面的代码)

function fn(obj)
{ 
  obj=new Object(); 
  obj.name="Annie"; 
} 
var obj=new Object(); 
obj.name="jack"; 
fn(obj); 
console.log(obj.name);//jack
image.png

js自动拷贝了一个副本obj2,他与obj指向一个相同对象,此处函数内部更改了obj2的指向,让他指向了一个新的内存地址,再次为obj2设置一个name属性所以并未影响到obj,obj依然指向原来的对象。

表面上看上去引用类型是按引用传递,实则也是按值传递(此处值是内存地址的副本)。

如有错误欢迎指正

相关文章

网友评论

      本文标题:JS中函数参数值传递和引用传递

      本文链接:https://www.haomeiwen.com/subject/tgvalqtx.html