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 相关文章推荐
一个tab标签切换效果代码
Mar 27 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
基于jQuery的图片不完全按比例自动缩小
Jul 11 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
Jquery 分页插件之Jquery Pagination
Aug 25 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 Javascript
关于 jQuery Easyui异步加载tree的问题解析
Dec 06 Javascript
vue-swiper的使用教程
Aug 30 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
ES6 Iterator接口和for...of循环用法分析
Jul 31 Javascript
原生js实现自定义滚动条
Jan 20 Javascript
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
有趣的bootstrap走动进度条
2016/12/01 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
python友情链接检查方法
2015/07/08 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
python检索特定内容的文本文件实例
2018/06/05 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python 调试冷知识(小结)
2019/11/11 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
sort命令的作用和用法
2012/11/04 面试题
报社实习生自荐信
2014/01/24 职场文书
个人投资计划书
2014/05/01 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
五年级数学教学反思
2016/02/16 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
React更新渲染原理深入分析
2022/12/24 Javascript