深入浅析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 相关文章推荐
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
Jun 22 Javascript
QQ空间顶部折页撕开效果示例代码
Jun 15 Javascript
JS在IE下缺少标识符的错误
Jul 23 Javascript
JavaScript 浏览器对象模型BOM使用介绍
Apr 13 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 Javascript
微信小程序实现单选选项卡切换效果
Jun 19 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
Jun 07 Javascript
uni-app实现点赞评论功能
Nov 25 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
Dec 01 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
如何编写一个 Webpack Loader的实现
Oct 18 Javascript
vue created钩子函数与mounted钩子函数的用法区别
Nov 05 Javascript
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
晶体管单管来复再生式收音机
2021/03/02 无线电
如何使用PHP获取网络上文件
2006/10/09 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
分享PHP守护进程类
2015/12/30 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
起点页面传值js,有空研究学习下
2010/01/25 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
python发送伪造的arp请求
2014/01/09 Python
Python简单获取自身外网IP的方法
2016/09/18 Python
Python测试人员需要掌握的知识
2018/02/08 Python
python找出因数与质因数的方法
2019/07/25 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
妇科医生自荐信
2013/11/05 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
党员个人整改措施
2014/10/24 职场文书
2014年度思想工作总结
2014/11/27 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
社区活动总结范文
2015/05/07 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript