深入浅析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高级程序设计
Dec 29 Javascript
关于文本限制字数的js代码
Apr 02 Javascript
js url传值中文乱码之解决之道
Nov 20 Javascript
javascript中HTMLDOM操作详解
Dec 11 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
Redis基本知识、安装、部署、配置笔记
Mar 05 Javascript
基于jQuery实现点击列表加载更多效果
May 31 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
jQuery插件zTree实现获取一级节点数据的方法
Mar 08 Javascript
vue项目中定义全局变量、函数的几种方法
Nov 08 Javascript
jquery实现上传图片功能
Jun 29 jQuery
JS新手入门数组处理的实用方法汇总
Apr 07 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
定制FileField中的上传文件名称实例
2017/08/23 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
自我查摆剖析材料
2014/10/11 职场文书
2015新学期家长寄语
2015/02/26 职场文书
运动会口号霸气押韵
2015/12/24 职场文书