深入浅析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 相关文章推荐
用JavaScript隐藏控件的方法
Sep 21 Javascript
基于jquery的跟随屏幕滚动代码
Jul 24 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
JS实现的多张图片轮流播放幻灯片效果
Jul 22 Javascript
jQuery给指定的table动态添加删除行的操作方法
Oct 12 Javascript
jQuery旋转插件jqueryrotate用法详解
Oct 13 Javascript
BootStrap tooltip提示框使用小结
Oct 26 Javascript
前端 Vue.js 和 MVVM 详细介绍
Dec 29 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
详解各版本React路由的跳转的方法
May 10 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
Vue请求java服务端并返回数据代码实例
Nov 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
模拟flock实现文件锁定
2007/02/14 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
dedecms中使用php语句指南
2014/11/13 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
详解JavaScript的变量
2019/04/04 Javascript
python将print输出的信息保留到日志文件中
2019/09/27 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
校庆筹备方案
2014/03/30 职场文书
感恩之星事迹材料
2014/05/03 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
银行授权委托书格式
2014/10/10 职场文书
2014年手术室工作总结
2014/11/26 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
道士塔读书笔记
2015/06/30 职场文书
三八妇女节主持词
2015/07/04 职场文书
大学生社会实践感想
2015/08/11 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
高中信息技术教学反思
2016/02/16 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
Python加密技术之RSA加密解密的实现
2022/04/08 Python
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript