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 相关文章推荐
CCPry JS类库 代码
Oct 30 Javascript
基于Jquery的跨域传输数据(JSONP)
Mar 10 Javascript
跨域传值即主页面与iframe之间互相传值
Dec 09 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
基于Vue如何封装分页组件
Dec 16 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
Jan 23 Javascript
ES6 javascript中Class类继承用法实例详解
Oct 30 Javascript
小程序自定义组件实现城市选择功能
Jul 18 Javascript
JavaScript之解构赋值的理解
Jan 30 Javascript
基于layui轮播图满屏是高度自适应的解决方法
Sep 16 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 Javascript
JS求解两数之和算法详解
Apr 28 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的输入输出流
2007/02/14 PHP
php 静态页面中显示动态内容
2009/08/14 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
php实现Session存储到Redis
2015/11/11 PHP
一个简单的php路由类
2016/05/29 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
jquery.messager.js插件导致页面抖动的解决方法
2013/07/14 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
python+opencv实现动态物体识别
2018/01/09 Python
Python3 中文文件读写方法
2018/01/23 Python
Django框架模板介绍
2019/01/15 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
eclipse创建python项目步骤详解
2019/05/10 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
办护照工作证明范本
2014/01/14 职场文书
立志成才演讲稿
2014/09/04 职场文书
欢送领导祝酒词
2015/08/12 职场文书
个人工作总结怎么写?
2019/04/09 职场文书