深入浅析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 相关文章推荐
prototype 中文参数乱码解决方案
Nov 09 Javascript
Javascript类库的顶层对象名用户体验分析
Oct 24 Javascript
jQuery Form 页面表单提交的小例子
Nov 15 Javascript
Javascript异步编程模型Promise模式详细介绍
May 08 Javascript
JS获取时间的方法
Jan 21 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
详解angularjs popup-table 弹出框表格指令
Sep 20 Javascript
JavaScript 异步调用
Oct 25 Javascript
ReactNative中使用Redux架构总结
Dec 15 Javascript
基于Vue实现拖拽功能
Jul 29 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 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集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
Document 对象的常用方法
2009/07/31 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
python3.0 字典key排序
2008/12/24 Python
Python实现partial改变方法默认参数
2014/08/18 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python实现聚类算法原理
2018/02/12 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python excel转换csv代码实例
2019/08/26 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
庆元旦文艺演出主持词
2014/03/27 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
追悼会答谢词
2015/01/05 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
PHP设计模式(观察者模式)
2021/07/07 PHP