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 相关文章推荐
拖动Html元素集合 Drag and Drop any item
Dec 22 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
Feb 23 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
Mar 01 Javascript
Bootstrap零基础学习第一课之模板
Jul 18 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
Jan 11 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
Feb 19 Javascript
js实现京东轮播图效果
Jun 30 Javascript
Vue.JS项目中5个经典Vuex插件
Nov 28 Javascript
Angular实现可删除并计算总金额的购物车功能示例
Dec 26 Javascript
关于jquery中attr()和prop()方法的区别
May 28 jQuery
微信小程序canvas截取任意形状的实现代码
Jan 13 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 fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
用cookies实现的可记忆的样式切换效果代码下载
2007/12/24 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
jquery each()源代码
2011/02/14 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
Python将多个excel文件合并为一个文件
2018/01/03 Python
python实现朴素贝叶斯算法
2018/11/19 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
HTML文本属性&颜色控制属性的实现
2019/12/17 HTML / CSS
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
干部作风建设个人剖析材料
2014/10/11 职场文书
盗窃案辩护词
2015/05/21 职场文书
七年级作文之秋游
2019/10/21 职场文书
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
alibaba seata服务端具体实现
2022/02/24 Java/Android
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫