javascript的变量、传值、传址、参数之间关系


Posted in Javascript onJuly 26, 2015

先把收获晾一下:

1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值。引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型);5种基本类型包括:undefined,null,string,boolean,number

2.函数的参数的传递的机制是复制变量值。

书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样。基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制一样。“ 

”当一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响到另一个变量。“

【注意:复制引用类型的值,才是传址】

3.参数实际上是函数的局部变量。

----------------------------------------------------------------------------

基本概念的解释:

传值:把A的数值传到B,改变B,A不会跟着变,B存的是跟A一样的值;
传址:把A的地址传到B,改变B,A同时跟着变,B存的只是A的地址(类似电脑的快捷方式)。

一个具有值类型(value type)的数据存放在栈内的一个变量中。即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。值类型的数据具有较快的存取速度。

一个具有引用类型(reference type)的数据并不驻留在栈中,而是存储于堆中。即是在堆中分配内存空间,不直接存储所包含的值,而是指向所要存储的值,其值代表的是所指向的地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度。

----------------------------------------------------------------------------

下面是三个问题。

【问题1】:为什么change(a)函数执行完之后,外面的a没有受干扰呢?

<script>
var a = [1, 2, 3];
function change(a) {
 console.log(a);//[1,2,3]
 a = 2;   //传值
 console.log(a);//2
}
change(a);
console.log(a);  //[1,2,3] 
</script>

问题1解答:因为change(a)的执行过程是这样的,首先将对象a(数组)传入到change以后,被复制给change的参数a。而后a=2是一个赋值语句,变成传值。此时a=2是值类型,并不涉及引用地址的问题。所以并没有影响外部的a。

【问题2】:为什么change(a)函数执行完之后,外面的a受到干扰呢?

<script>
 var a = [1, 2, 3];
 function change() { 
  a = 2;//传值
 }
 change();
 console.log(a);  //2 
</script>

 问题2解答:当执行change()的时候,函数在自己的执行环境中找寻作用域链,活动对象(activation object)并不包含变量a,于是沿着作用域链向上找,找到全局执行环境,发现变量a,于是此时函数内部的a和外部a在内存上是同一个地址,自然函数内部a变了,外部也会跟着变。

解析:问题2和问题1的区别在于,问题2并没有引入参数,所以不涉及复制变量的事情。

【问题3】:为什么change(a)函数执行完之后,外面的a受到干扰呢?

<script>
 var a = [1, 2, 3];
 function change(b) { 
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[2,2,3]
</script>

问题3解答:这个和问题1非常类似,唯独不一样的就是a=2,换成了b[0]=2,我一开始也很疑惑,不说复制吗?参数b应该是个复制值,怎么会影响到外面的a呢?

的确,change函数执行时,参数b是a的复制值。因为a是引用类型,所以在函数内部是b和a按引用来访问的是一个地址的对象。b[0]=2的出现,并不影响在函数内部b和a引用的是同一个对象。

【问题4】:为什么change(a)函数执行完之后,外面的a没有受到干扰呢?

var a = [1, 2, 3];
 function change(b) { 
  console.log(b);//[1,2,3]
  b=2;
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[1,2,3]

 问题4解答:change(b)执行过程是这样的,a对象传入change函数,将值和地址复制给b。b=2这句,此时b变成值类型了,并不涉及地址引用的问题,之后b[0]=2这句实际上毫无意义,因为此时b已经不是数组了,自然不具有b[0]这样的索引方式。所以b与a的地址引用关系其实在b=2之后就消失了。此时外界的a仍然是[1,2,3];

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
些很实用且必用的小脚本代码
Jun 26 Javascript
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
Jul 04 Javascript
jQuery+jRange实现滑动选取数值范围特效
Mar 14 Javascript
jQuery超赞的评分插件(8款)
Aug 20 Javascript
原生js实现弹出层登录拖拽功能
Dec 05 Javascript
Vuex和前端缓存的整合策略详解
May 09 Javascript
微信小程序表单验证错误提示效果
May 19 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
Sep 20 Javascript
jQuery实现消息弹出框效果
Dec 10 jQuery
javascript实现动态导入js与css等静态资源文件的方法
Jul 25 #Javascript
javascript创建动态表单的方法
Jul 25 #Javascript
javascript文件加载管理简单实现方法
Jul 25 #Javascript
javascript页面倒计时实例
Jul 25 #Javascript
javascript解析xml实现省市县三级联动的方法
Jul 25 #Javascript
基于javascript实现单选及多选的向右和向左移动实例
Jul 25 #Javascript
javascript实现信息增删改查的方法
Jul 25 #Javascript
You might like
example2.php
2006/10/09 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
php获取系统变量方法小结
2015/05/29 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
JS跨域代码片段
2012/08/30 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
百度地图自定义控件分享
2015/03/04 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
jquery之基本选择器practice(实例讲解)
2017/09/30 jQuery
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
python中base64加密解密方法实例分析
2015/05/16 Python
让Python代码更快运行的5种方法
2015/06/21 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python版名片管理系统
2018/11/30 Python
python cumsum函数的具体使用
2019/07/29 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
职业教育毕业生求职信
2013/11/09 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
会计自我鉴定
2014/02/04 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
2015年毕业实习工作总结
2014/12/12 职场文书
素质拓展训练感想
2015/08/07 职场文书