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实现按Enter键触发事件示例
Sep 10 Javascript
javascript设置连续两次点击按钮时间间隔的方法
Oct 28 Javascript
js图片切换具体实现代码
Oct 13 Javascript
给easyui datebox扩展一个清空的实例
Nov 09 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
基于js中this和event 的区别(详解)
Oct 24 Javascript
Element-ui table中过滤条件变更表格内容的方法
Mar 02 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
关于vue编译版本引入的问题的解决
Sep 17 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
Oct 22 Javascript
原生javascript实现连连看游戏
Jan 03 Javascript
vue实现输入框自动跳转功能
May 20 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
一段批量给页面上的控件赋值js
2010/06/19 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
vue.js的安装方法
2017/05/12 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
Python读写及备份oracle数据库操作示例
2018/05/17 Python
Python阶乘求和的代码详解
2020/02/14 Python
python 19个值得学习的编程技巧
2020/08/15 Python
Python hashlib模块的使用示例
2020/10/09 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
AOP的定义以及作用
2013/09/08 面试题
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
Shell编程面试题
2012/05/30 面试题
酒店服务实习自我鉴定
2013/09/22 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
市场营销管理制度
2014/01/29 职场文书
园林系毕业生求职信
2014/06/23 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
素质拓展训练感想
2015/08/07 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
Python道路车道线检测的实现
2021/06/27 Python