深入浅析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 EasyUI API 中文文档 - ProgressBar 进度条
Sep 29 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
去除html代码里面的script正则方法
May 19 Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 Javascript
jQuery实现简单的抽奖游戏
May 05 jQuery
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 Javascript
javascript实现手动点赞效果
Apr 09 Javascript
微信小程序云开发之新手环境配置
May 16 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 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封装的HttpClient类用法实例
2015/06/17 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PDO::getAttribute讲解
2019/01/28 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
javascript RadioButtonList获取选中值
2009/04/09 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
python logging模块的使用总结
2019/07/09 Python
Python利用命名空间解析XML文档
2020/08/10 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
python Cartopy的基础使用详解
2020/11/01 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
国际贸易个人求职信范文
2014/01/04 职场文书
合伙协议书
2014/04/23 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
2014年度安全工作总结
2014/12/04 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
Python中for后接else的语法使用
2021/05/18 Python
zabbix监控mysql的实例方法
2021/06/02 MySQL
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
python实现商品进销存管理系统
2022/05/30 Python
JavaScript前端面试组合函数
2022/06/21 Javascript