深入浅析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.validate使用攻略 第一部
Jul 01 Javascript
基于jQuery选择器的整理集合
Apr 26 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
Oct 01 Javascript
javascript中定义类的方法汇总
Dec 28 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
Aug 07 Javascript
微信公众号菜单配置微信小程序实例详解
Mar 31 Javascript
浅谈JavaScript作用域和闭包
Sep 18 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
Jan 22 Javascript
JS+H5 Canvas实现时钟效果
Jul 20 Javascript
js异步上传多张图片插件的使用方法
Oct 22 Javascript
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
关于vue中如何监听数组变化
Apr 28 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
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python实现爬取图书封面
2018/07/05 Python
Python实现Dijkstra算法
2018/10/17 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
网络工程师职业规划
2014/02/10 职场文书
商业房地产广告语
2014/03/13 职场文书
房产转让协议书
2014/04/11 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
2014年司法局工作总结
2014/12/11 职场文书
放假通知格式
2015/04/14 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS