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 相关文章推荐
JavaScript 检测浏览器和操作系统的脚本
Dec 26 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
Sep 17 Javascript
JQuery实现表格动态增加行并对新行添加事件
Jul 30 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
基于JavaScript实现动态创建表格和增加表格行数
Dec 20 Javascript
js验证框架实现代码分享
May 18 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
Sep 17 Javascript
angular仿支付宝密码框输入效果
Mar 25 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
Oct 16 Javascript
vue-cli3配置与跨域处理方法
Aug 17 Javascript
原生JavaScript实现弹幕组件的示例代码
Oct 12 Javascript
基于javascript原生判断DOM是否加载完毕
Oct 14 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
用PHP连mysql和oracle数据库性能比较
2006/10/09 PHP
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
Python实现网站注册验证码生成类
2017/06/08 Python
python生成n个元素的全组合方法
2018/11/13 Python
python字典的常用方法总结
2019/07/31 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
暑假实习求职信范文
2013/09/22 职场文书
公司接待方案
2014/03/08 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
退税申请报告怎么写
2015/05/18 职场文书
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
2021/03/29 PHP
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python