js的函数的按值传递参数(实例讲解)


Posted in Javascript onNovember 16, 2017

js的函数传参的方式是按值传递,正常情况下,改变函数参数的值,并不会对函数外部的变量造成影响。例如:

'use strict';
var list = [1, 2, 3];
list.forEach(function(item) {
 item ++;
});
console.log(list); // [ 1, 2, 3 ]

这是因为js的函数在接收参数时,会生成一个副本变量,该副本变量等于参数的值,可以分析js这样运行的:

'use strict';
var list = [1, 2, 3];
list.forEach(function(item, i) {
 // 第一个item是副本,第二个item是数组元素list[i]
 var item = item;
 // 副本item++
 item ++;
 // 打印的是副本的值
 console.log(item); // 2, 3, 4
});
// 原数组不会改变
console.log(list); // [ 1, 2, 3 ]

但是当函数的参数传递的是一个对象呢?

'use strict';var list = [{a: 1, b: 2}];
list.forEach(function(item) {
 item.a ++;
});
console.log(list); // [ { a: 2, b: 2 } ]

发现函数内部居然改变了函数外部变量的值,那这又是为什么呢?

我们来分析js是如何运行这段代码的

'use strict';
var list = [{a: 1, b: 2}];
list.forEach(function(item, i) {
 // 第一个item是副本,第二个item是数组元素list[i]
 var item = item;
 // 此时item和list[i]指向的是同一地址,故两者完全一样
 console.log(item === list[i]); // true
 // 此时item.a++ 亦即 list[i].a++
 item.a ++;
 // list[i]的值已经改变
 console.log(list[i]); // { a: 2, b: 2 }
});
console.log(list); // [ { a: 2, b: 2 } ]

那么为什么会产生这种情况呢?

由于js中对象属于引用类型,var item = item 这一步相当于把 list[i] 的地址赋值给了item,他们两个指向的都是原对象的地址,所以通过其中的一个去修改值时其实是修改他们指向的那个对象。例子中通过 item.a++ 方法改变了原对象的值,因此最后应该输出 [ { a: 2, b: 2 } ]。

以上这篇js的函数的按值传递参数(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
自写的一个jQuery圆角插件
Oct 26 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
Aug 26 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
js简单实现调整网页字体大小的方法
Jul 23 Javascript
基于js对象,操作属性、方法详解
Aug 11 Javascript
canvas雪花效果核心代码分享
Feb 19 Javascript
原生js轮播特效
May 18 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
js实现本地图片文件拖拽效果
Jul 18 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
js实现无缝轮播图插件封装
Jul 31 Javascript
React/Redux应用使用Async/Await的方法
Nov 16 #Javascript
详谈DOM简介及节点、属性、查找节点的方法
Nov 16 #Javascript
图片加载完成再执行事件的实例
Nov 16 #Javascript
详解React 在服务端渲染的实现
Nov 16 #Javascript
Angular 5.0 来了! 有这些大变化
Nov 15 #Javascript
详解React Native 采用Fetch方式发送跨域POST请求
Nov 15 #Javascript
bootstrap 通过加减按钮实现输入框组功能
Nov 15 #Javascript
You might like
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
php unset全局变量运用问题的深入解析
2013/06/17 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
php实现图片缩略图的方法
2016/03/29 PHP
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Pyqt5实现英文学习词典
2019/06/24 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
python如何删除文件、目录
2020/06/23 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
土木工程毕业生自荐信
2013/09/21 职场文书
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
幼师专业毕业生自荐信
2013/09/29 职场文书
工程造价管理专业大专生求职信
2013/10/06 职场文书
廉政教育心得体会
2014/01/01 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
mysql数据库如何转移到oracle
2022/12/24 MySQL