深入浅析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 each函数的链式调用
Jul 22 Javascript
jquery设置元素的readonly和disabled的写法
Sep 22 Javascript
node.js中的fs.futimes方法使用说明
Dec 17 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
May 12 Javascript
Javascript函数的参数
Jul 16 Javascript
js+css简单实现网页换肤效果
Dec 29 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
Mar 28 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
Jun 14 Javascript
深入Vue-Router路由嵌套理解
Aug 13 Javascript
详解Vue的watch中的immediate与watch是什么意思
Dec 30 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
Sep 02 Javascript
js删除对象中的某一个字段的方法实现
Jan 11 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 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
vue实现公共方法抽离
2020/07/31 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
浅谈编码,解码,乱码的问题
2016/12/30 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python单例设计模式实现解析
2020/01/07 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
python能做哪方面的工作
2020/06/15 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
社区八一活动方案
2014/02/03 职场文书
毕业留言寄语大全
2014/04/10 职场文书