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 相关文章推荐
YUI 读码日记之 YAHOO.util.Dom - Part.1
Mar 22 Javascript
JavaScript写的一个自定义弹出式对话框代码
Jan 17 Javascript
jQuery LigerUI 使用教程入门篇
Jan 18 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
js验证是否为数字的总结
Apr 14 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
Mar 25 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
Jquery获取当前城市的天气信息
Aug 05 Javascript
js获取腾讯视频ID的方法
Oct 03 Javascript
Angular 实现输入框中显示文章标签的实例代码
Nov 07 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
Jun 20 Javascript
vue.js中ref及$refs的使用方法解析
Oct 08 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获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
PHP多进程编程实例
2014/10/15 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
Python sys.path详细介绍
2013/10/17 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
windows系统下Python环境搭建教程
2017/03/28 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
django从后台返回html代码的实例
2020/03/11 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
Python如何将模块打包并发布
2020/08/30 Python
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
幼儿园中秋节活动反思
2014/02/16 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
三年级学生评语大全
2014/12/26 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
Python 发送SMTP邮件的简单教程
2021/06/24 Python