注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

梦幻雪冰

技在手,能在身,思在脑,从容过生活——陈能堡

 
 
 

日志

 
 

【转载】JavaScript-引用类型变量的那个坑  

2015-03-25 12:18:19|  分类: JavaScript |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

JavaScript-引用类型变量的那个坑

前日,自己的一个小伙伴在研究一个问题,拿出来跟大家分享一下。先来看两个demo:

demo1

  1. function changeName(username){
  2.     username = '刘国利';
  3. }
  4. var username = '独行冰海';
  5. changeName(username);
  6. console.log(username);

demo2

  1. function changeName(username){
  2.     username[0] = '刘国利';
  3. }
  4. var username = ['独行冰海', '梦幻雪冰', '尹小芃槑', '路过心上', '扶、公子'];
  5. changeName(username);
  6. console.log(username);

两段代码输出结果分别是什么呢?第一段代码输出的是“独行冰海”的字符串,第二段代码输出的是["刘国利", "梦幻雪冰", "尹小芃槑", "路过心上", "扶、公子"] 这个数组。

JavaScript中的两种变量类型:值类型和引用类型。对于有过C语言等编程语言经验的人对这两种类型不陌生,很容易联想到“引用地址”或“指针”的相关概念。下面详细讲解一下两种不同类型的知识。相信在讲解了这两个知识之后,上面的问题也就迎刃而解了。

值类型变量

值类型:数值、布尔值、null、undefined、字符串。

变量的交换等于在一个新的作用域创建一个新的空间,新空间与之前的空间互不相关和影响。

引用类型变量

引用类型:对象、数组、函数。

变量的交换,并不会创建一个新的空间,而是让对象或方法和之前的对象或方法,同时指向一个原有空间(即一个地址)。就如同原来一个人有家门的钥匙,之后这个人结婚了,就配了一把钥匙给自己的妻子,这时候,两个人共同有家的钥匙,但是家还是一个家。

代码分析

弄明白了这两种不同的类型,我们就可以回看我们的代码了。先说第一段代码,外部全局中存在一个变量,username,在函数中形参名也为username,此时,当在局部作用域当中没有var声明变量空间的时候,遇到username这个变量名,首先查看是不是形参,如果是形参,那么直接认为changeName中的username就是形参。形参是属于changeName函数中的,加上传入的参数是值类型变量(字符串),就又创建了一个存储空间,这个存储空间是不会影响到外部全局变量创建的存储空间的。

第二段代码,虽然也是基本的形参,但是此处传入的是引用类型变量(数组),那么此时并没有创建一个新的空间,函数的形参以及全局的变量均指向同一个空间,当对两者任意的内容进行修改时,均是在修改一个空间。

结束~!

 

欢迎大家互相学习交流。独行冰海

  评论这张
 
阅读(25)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017