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 相关文章推荐
JS链式调用的实现方法
Mar 07 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
Jun 25 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
Dec 30 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
Mar 18 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
AngularJS中的过滤器filter用法完全解析
Apr 22 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
分析javascript中9 个常见错误阻碍你进步
Sep 18 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
Jul 11 Javascript
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
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JavaScript实用技巧(一)
2010/08/16 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中replace方法实例分析
2014/08/20 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
python运行其他程序的实现方法
2017/07/14 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python Django view 两种return的实现方式
2020/03/16 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
详解python中的lambda与sorted函数
2020/09/04 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
八年级音乐教学反思
2014/01/09 职场文书
公司委托书范本
2014/04/04 职场文书
电台编导求职信
2014/05/06 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
成本会计岗位职责
2015/02/03 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
感恩的心主题班会
2015/08/12 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL
Redis RDB技术底层原理详解
2021/09/04 Redis