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 相关文章推荐
Javascript this 的一些学习总结
Aug 02 Javascript
JS实现距离上次刷新已过多少秒示例
May 23 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
Jun 05 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
Aug 12 Javascript
ionic开发中点击input时键盘自动弹出
Dec 23 Javascript
jQuery输入框密码的显示隐藏【代码分享】
Apr 29 jQuery
jQuery选择器之属性筛选选择器用法详解
Sep 19 jQuery
JS随机数产生代码分享
Feb 24 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
Sep 01 Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 Javascript
AngularJS动态生成select下拉框的方法实例
Nov 17 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文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
Dojo 学习要点
2010/09/03 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
JavaScript实现省市联动效果
2019/11/22 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
Python MySQLdb Linux下安装笔记
2015/05/09 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
用python实现一个简单的验证码
2020/12/09 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
函授自我鉴定范文
2014/02/06 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
小组名称和口号
2014/06/09 职场文书
安全责任书怎么写
2014/07/28 职场文书
寒假安全保证书
2015/02/28 职场文书
实习生个人总结范文
2015/02/28 职场文书
2015年库房工作总结
2015/04/30 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
学习党史心得体会2016
2016/01/23 职场文书