问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript值传递和引用传递的问题,代码如下

发布网友 发布时间:2022-05-10 04:35

我来回答

3个回答

懂视网 时间:2022-05-14 18:35

本篇文章给大家带来的内容是关于javascript中的值传递和引用传递的详细讲解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

值传递是针对基本类型的,而引用传递是针对引用类型的。传参可以理解为:复制变量的值,把这个副本传递给形参。

基本类型复制后,形参与实参完全是独立的,不管改变哪一个,都不会对另一个产生影响。

引用传递本质上还是传值,具体的步骤是:1、先在栈中开辟形参引用。2、把实参引用的值传递给形参引用。

1、值传递

function add(num) {
 num++;
 console.log("形参:", num);
}

var a = 20;
add(a);
console.log("实参:", a);

结果如下:

根据结果分析:调用add(a),传递的实参a=20,把实参复制一份,把复制本传递给形参num,所以num++后并没有影响实参a的值。

2、引用传递

function setNum(obj) {
 obj.num = 10;
 console.log("形参:", obj);
}

var a = new Object();
setNum(a);
console.log("实参:", a);

结果如下:

当var a = new Object();时,下图时变量和对象的关系:

调用setNum(a);时,下图是全局变量a和局部变量obj以及对象Object的关系:

这段代码创建了一个Object对象,变量(引用)a指向这个Object对象。调用setNum(a),在这个函数内部,obj和a都引用的是同一Object对象,即a和obj都指向同一个堆内存地址。所以,通过传递实参引用a,对形参引用obj添加num属性后,也影响到了实参引用a。所以,很多人就会被这种假象所蒙蔽,错误的认为:在局部作用域修改对象,会在全局对象中反映出来,就说明参数是引用传递。

所以,以下是我的进一步分析:

function setNum(obj) {
 obj.num = 10;
 obj = new Object();
 obj.num = 20;
 console.log("形参:", obj);
}

var a = new Object();
setNum(a);
console.log("实参:", a);

结果如下:

在函数内部创建obj对象 obj = new Object(); 下图是a和obj以及Object的关系:

这段代码在前一个的基础上,给setNum()函数中添加了两行代码:obj = new Object()改变了obj的指向;obj.num = 20给新创建的obj添加属性。根据结果来看,形参的改变并没有影响到实参,所以,在JS中,引用传递的本质就是值传递。

热心网友 时间:2022-05-14 15:43

这里涉及到javascript变量赋值的问题。首先解释一下,变量赋值的两种情况,一种是基本数据类型如(number类型、boolean类型等),一种则是引用类型如({},[],function等)。前者变量持有的值,后者持有对象的引用。何谓对象的引用,比较浅显地说就是指向存储对象地址值。当多个变量持有同一引用时,通过它们的任何一个都可以改变对象。比如

var a;
var b;
b = a = {value: 'Hello World'};//b和a持有相同引用
a.value = 'Good morning';//通过a向对象添加属性,b也可访问得到
alert(b.value);//输出Good morning

理解了上面,就好解释楼主的代码了,现在一一解析,注意看代码后面的注释

function test1(){
  var a={};//变量a持有一个空对象的引用
  var b=a;//变量b、a持有一个相同的引用
  a['com']={};//通过变量a向对象添加属性,由于b与a持有引用相同,所以b也可访问到com
  a={};//变量a持有另一个空对象引用,此时b和a引用不同,a添加属性不会影响到b
  a['test']={};//由于a和b引用不同,这里添加test属性,b是访问不到的。
  a={};//变量持有另一个空引用,此时b和a引用还是不同,后面的道理同上。
  a['momo']={};
  a={};
  console.log(a);//最终a={}
  console.log(b)//b={com:{}}
 }
 function test2(){
  var a={};//变量a持有一个空对象的引用
  var b=a;//变量b和a持有相同引用,所以通过a向对象添加属性,b也可以访问。
  a['com']={};
  a['test']={};
  a['momo']={};
  console.log(a);//a = b = {com:{},test:{},momo:{}}
  console.log(b);
 }

对比代码楼主应该知道,test1和test2的区别在于,变量a在test1中不断的赋值新的引用,导致a与b持有的引用不同,后面向a添加的属性,b都无法访问到。

热心网友 时间:2022-05-14 17:01

javascript中的Object 和 Array 赋值 和 PHP中的 引用是一个道理, 也就是 函数中的赋值相当于引用了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
“苏大强”的本意是什么?抹黑江苏吗? 伦敦奥运会入场式各个国家和地区的先后顺序 参加奥运会入场式的前后顺序 神马是费用性斜视?没听说过,斜视不就是斗鸡眼么 小儿斜视原因 为了不出现重影,右眼会被推到外斜视眼位,称为“废用性斜视” 在八岁时玩鞭炮炸伤左眼,而形成左眼斜视,现在能治好吗 ...后左眼斜视外斜 左眼下半部有光感 视觉模糊 请问左手术的话 能恢复... 两眼视力差距大会怎么样 关于耳洞的小问题~有经验的和懂行的进~ Javascript是按值传递还是按引用传递 js的实参是按值传递还是按引用传递 javascript传递参数如果是object的话,是按值传递还是按引用传递 JavaScript中的值是按值传递还是按引用传递问题探讨 JavaScript 是按值传递还是按引用传递的 苹果手机设置铃声里面没有喜欢的铃声怎么办 江河对于人类的发展有很重要的意义,我国著名的大江、大河有哪些? 世界第一大河是什么河流? 我家的电脑怎样才能让网速快一些呢? 用什么办法才能使电脑的网速变快 大河的河的草书怎么写 写一篇800字的家庭困难演讲稿 最美家庭发言稿怎么写 电饭煲自制蛋糕,按煮饭键,中间看过有发好大然后怕不熟就又按了煮饭键就一直没跳,过一会整个就一饼了 云米智能电饭煲总是自动跳到蛋糕模式怎么办? 为什么添加不上QQ好友了呢 ap是什么 甘油三脂0.90属于正常吗? 血脂四项的正常范围为多少?甘油三酯多少是正常 甘油三酯标准值范围 js中函数的参数传递是值传递还是引用传递?怎么判断参数的类型_百度知 ... 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法 如何理解JavaScript中对象的值传递和引用传递 javascript的函数是按引用传递还是按值传递 南京工业大学教务处分管哪些项目 设备处和教务处合并后的首次会议方案 结束桌面进程问题 为什么结束一个进程整个桌面图标都不见了? 怎么把电脑的桌面进程停止掉? 为什么我的电脑桌面只要按了结束进程就没了啊? 世纪f7无人机怎么拍照 北京朝阳区一男子擅自用无人机航拍被行拘,你如何看待此事? 《六指琴魔》电视版古筝插曲 蓝洁瑛版的六指琴魔插曲是什么古筝曲 子 六指琴魔电影林青霞主演大有一段古筝独奏的曲谁知道? 《六指琴魔》中那首琴曲叫什么? 求吴奇隆版六指琴魔中一首古筝曲! 宁静<六指琴魔>里的那首古筝去是什么啊? 电视剧六指琴魔宁静版第2集中王雪梅谈的那首古筝曲的下载链接谁能告诉我谢谢 六指琴魔主题曲?