
JavaScript按值传递与按共享传递
发布日期:2021-05-07 10:15:42
浏览次数:11
分类:原创文章
本文共 959 字,大约阅读时间需要 3 分钟。
在开始JavaScript按值传递与按共享传递的探讨之前,我们先要知道JavaScript的五种基本数据类型、按值传递与按引用传递的概念。
- JavaScript的5种基本数据类型分别是:Undefined、Null、Boolean、Number、String
- 按值传递:函数的形参是被调用时所传实参的副本,修改形并不会影响实参。
- 按引用传递:函数的形参接收实参的内存地址,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。这里可以给大家预告一下,虽然说JavaScript没有按引用传递的说法,但后面将要提到的“按共享传递”中会用到“按引用传递”的概念。
在JavaScript中,基本数据类型按值传递,比如
var a=100;function foo(x){ x=1;}foo(a);console.log(a)
最后输出的结果为100,变量a并没有被修改为1
而JavaScript中对象的传递与基本类型不同,它是按共享传递的。我对按共享传递的理解是——按共享传递时,我们应该把形参看做由两部分组成,一部分是形参本身、一部分是形参属性所指向的地址。形参本身是按值传递的,但形参属性所指向的地址却和实参属性地址一样,可以看作按引用传递。
如何理解上面这堆不知所云的概念呢? 我们来看个栗子
var a={ x:1, y:2}function foo(obj){ obj={ x:3, y:4 }}foo(a)console.log(a)
最后输出的结果a仍然是{x:1,y:2}。这是因为形参本身是按值传递的,修改形参本身不会造成实参的修改,如果我们把上面的代码改成如下这样子
var a={ x:1, y:2}function foo(obj){ obj.x=3; obj.y=4;}foo(a)console.log(a)
最后就会很神奇的发现a被修改为了{x:3,y:4},这是因为形参属性所指向的地址与实参所指向的地址一样,修改的形参的属性就同时修改了实参的属性。
所以,大家就只需要记住五种基本类型按值传递,对于对象而言,直接修改形参对实参没有效果,而修改形参的属性却可以同时修改实参的属性。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月25日 02时46分09秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
F5打造“感知可控,随需而变的应用” 助力企业实现非凡数字体验
2019-03-04
CSDN湘苗培优|保持热情,告别平庸
2019-03-04
Serverless 在大规模数据处理中的实践
2019-03-04
高可用Redis服务架构分析与搭建
2019-03-04
运营商的互联网蜕变,从沃云平台开始
2019-03-04
下一次 IT 变革:边缘计算(Edge computing)
2019-03-04
Gartner的预言:通向混合IT之旅
2019-03-04
Docker精华问答 | task与executor有什么关系?
2019-03-04
英特尔强势上新一大波数据产品,小伙伴们“奔走相告”…… | 极客头条
2019-03-04
成为最大的独立开源公司,对SUSE意味着什么? | 人物志
2019-03-04
Elastic全球用户大会Elastic{ON}首次落地北京
2019-03-04
红帽:将开源进行到底
2019-03-04
SaaS前世今生:老树开新花
2019-03-04
Hadoop精华问答 | Hadoop框架中最核心的设计是什么?
2019-03-04
微信小程序生命周期 / 页面的生命周期 / 页面的用户行为
2019-03-04
如何完美解答面试问题——深拷贝和浅拷贝的区别
2019-03-04
用C语言散列表实现电话薄
2019-03-04
微信小程序云开发手机商城项目源码+数据库+云后台+部署 (毕业生福利!)
2019-03-04
Maven的配置
2019-03-04
如何在bilibili上下载学习视频?
2019-03-04