深入浅析JS是按值传递还是按引用传递(推荐)


Posted in Javascript onSeptember 18, 2016

按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

按引用传递会使函数调用的追踪更加困难,有时也会引起一些微妙的BUG。

按值传递由于每次都需要克隆副本,对一些复杂类型,性能较低。两种传值方式都有各自的问题。

JS的基本类型,是按值传递的。

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为1, 未受x = 2赋值所影响

再来看看对象的传递:

var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了! 
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 仍然是1, obj并未被修改为100.

可以看出,对象的值得传递并不是按引用传递。其实,按共享传递 call by sharing,准确的说,JS中的基本类型按值传递,对象类型按共享传递的(call by sharing,也叫按对象传递、按对象共享传递)。

该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。

总之,基本类型是按值传递,而对于对象来说传入的是对象指向的地址,也可以认为其是特殊的按值传递。如果在函数内对对象的属性进行操作,实际就是对其指向对象的属性进行操作。但是,如果对其整体进行操作(比如:o = 100或者o = []),其实际是新定于了对象,实参的引用地址为新的对象的引用地址,与原来的引用没有任何关系,所以不会对原来的对象造成改变。

以上所述是小编给大家介绍的JS是按值传递还是按引用传递(推荐)的全部知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
再次分享18个非常棒的jQuery表格插件
Apr 10 Javascript
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
JQuery each()嵌套使用小结
Apr 18 Javascript
js中各种类型的变量在if条件中是true还是false
Jul 16 Javascript
利用Javascript裁剪图片并存储的简单实现
Mar 13 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 Javascript
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
JQuery控制DIV的选取实现方法
Sep 18 #Javascript
chrome下判断点击input上标签还是其余标签的实现方法
Sep 18 #Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 #Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 #Javascript
JQuery遍历元素的后代和同胞实现方法
Sep 18 #Javascript
AngularJS实现树形结构(ztree)菜单示例代码
Sep 18 #Javascript
利用jquery实现瀑布流3种案例
Sep 18 #Javascript
You might like
php xml文件操作代码(一)
2009/03/20 PHP
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
javascript模拟C#格式化字符串
2015/08/26 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
python实现按行分割文件
2019/07/22 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
database面试题
2013/03/28 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
会计与审计专业大专生求职信
2013/10/03 职场文书
机械个人求职信范文
2014/01/24 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
股份转让协议书
2014/04/12 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
Vue3.0 手写放大镜效果
2021/07/25 Vue.js