深入浅析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 相关文章推荐
firefo xml 读写实现js代码
Jun 11 Javascript
js如何实现设计模式中的模板方法
Jul 23 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
Node.js中的流(Stream)介绍
Mar 30 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
基于AngularJS实现的工资计算器实例
Jun 16 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
Jul 24 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
May 02 Javascript
从理论角度讨论JavaScript闭包
Apr 03 Javascript
Vue实现商品详情页的评价列表功能
Sep 04 Javascript
微信小程序select下拉框实现源码
Nov 08 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
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
js验证表单第二部分
2006/11/25 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
理解JS绑定事件
2016/01/19 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
利用python如何处理nc数据详解
2018/05/23 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Python 的AES加密与解密实现
2019/07/09 Python
python实现ip地址的包含关系判断
2020/02/07 Python
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
单位领导证婚词
2014/01/14 职场文书
中学生打架检讨书
2014/02/10 职场文书
爱情保证书大全
2014/04/29 职场文书
踏青活动策划方案
2014/08/19 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
鸡毛信观后感
2015/06/11 职场文书