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中ajax调用json数据的使用说明
Mar 17 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
Mar 31 Javascript
javascript+HTML5自定义元素播放焦点图动画
Feb 21 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
详解Webpack实战之构建 Electron 应用
Dec 25 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 Javascript
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
如何实现iframe父子传参通信
Feb 05 Javascript
JS自定义滚动条效果
Mar 13 Javascript
vue实现购物车的监听
Apr 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
DIY实用性框形天线
2021/03/02 无线电
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python 深入理解yield
2008/09/06 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
Python文件处理
2016/02/29 Python
python编程使用协程并发的优缺点
2018/09/20 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Pytorch 实现权重初始化
2019/12/31 Python
Python解析多帧dicom数据详解
2020/01/13 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
2014年迎新年活动方案
2014/02/19 职场文书
努力学习演讲稿
2014/05/10 职场文书
环保志愿者活动总结
2014/06/27 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
房屋租房协议书范本
2014/12/04 职场文书
争先创优个人总结
2015/03/04 职场文书