深入浅析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 相关文章推荐
json-lib出现There is a cycle in the hierarchy解决办法
Feb 24 Javascript
js汉字转拼音实现代码
Feb 06 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
JavaScript常用脚本汇总(三)
Mar 04 Javascript
一不小心就做错的JS闭包面试题
Nov 25 Javascript
JS中使用正则表达式g模式和非g模式的区别
Apr 01 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
Vue使用vue-cli创建项目
Sep 01 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
vue中实现动态生成二维码的方法
Feb 21 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
服务器web工具 php环境下
2010/12/29 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
详解Python中DOM方法的动态性
2015/04/11 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
python如何爬取个性签名
2018/06/19 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
3分钟学会一个Python小技巧
2018/11/23 Python
python函数的作用域及关键字详解
2019/08/20 Python
python实现超市商品销售管理系统
2019/11/22 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
大客户销售经理职责
2013/12/04 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
学生检讨书如何写
2014/10/30 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
运动会通讯稿100字
2015/07/20 职场文书
《包身工》教学反思
2016/02/23 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python