深入浅析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 相关文章推荐
jQuery设置div一直在页面顶部显示的方法
Oct 24 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
原生JavaScript实现合并多个数组示例
Sep 21 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
jquery html5 视频播放控制代码
Nov 06 Javascript
BootStrap表单验证实例代码
Jan 13 Javascript
Javascript中的神器——Promise
Feb 08 Javascript
JS实现的点击表头排序功能示例
Mar 27 Javascript
利用ECharts.js画K线图的方法示例
Jan 10 Javascript
微信小程序npm引入vant-weapp的踩坑记录
Aug 01 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 Javascript
Postman无法正常返回结果问题解决
Aug 28 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
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
php简单实现快速排序的方法
2015/04/04 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
Python写入CSV文件的方法
2015/07/08 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
理解python中生成器用法
2017/12/20 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
django 控制页面跳转的例子
2019/08/06 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
课前三分钟演讲稿
2014/04/24 职场文书
校园文明倡议书
2014/05/16 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
计算机实训报告总结
2014/11/05 职场文书
谢师宴答谢词
2015/01/05 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书