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 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
javascript拓展DOM操作 prependChild insertAfert
Nov 17 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
May 10 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
javascript this详细介绍
Sep 19 Javascript
bootstrap实现动态进度条效果
Mar 08 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
菊花转动的jquery加载动画效果
Aug 19 jQuery
npm qs模块使用详解
Feb 07 Javascript
JS实现无限轮播无倒退效果
Sep 21 Javascript
Js实现粘贴上传图片的原理及示例
Dec 09 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 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
西德产收音机
2021/03/01 无线电
基于php iconv函数的使用详解
2013/06/09 PHP
php网站地图生成类示例
2014/01/13 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python运行的17个时新手常见错误小结
2012/08/07 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
浅谈python迭代器
2017/11/08 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
python aiohttp的使用详解
2019/06/20 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
搬家公司的创业计划书
2014/01/01 职场文书
高一学生评语大全
2014/04/25 职场文书
学雷锋月活动总结
2014/04/25 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers