js的函数的按值传递参数(实例讲解)

 更新时间:2017年11月16日 10:07:30   作者:参与商  
下面小编就为大家分享一篇js的函数的按值传递参数的实例,具有很好的参考价值,一起跟随小编过来看看吧,希望对大家有所帮助

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的函数的按值传递参数(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • layui富文本编辑器前端无法取值的解决方法

    layui富文本编辑器前端无法取值的解决方法

    今天小编就为大家分享一篇layui富文本编辑器前端无法取值的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • JavaScript中关于iframe滚动条的去除和保留

    JavaScript中关于iframe滚动条的去除和保留

    在开发中经常遇到去掉全部的滚动条,去掉右边的滚动条且保留底下的滚动条,去掉底下的滚动条且保留右边的滚动条,大家基于js是怎么实现的呢?下面小编通过本文给大家详细介绍下,对js iframe滚动条相关知识感兴趣的朋友一起学习吧
    2016-11-11
  • JavaScript实现左侧菜单效果

    JavaScript实现左侧菜单效果

    这篇文章主要为大家详细介绍了JavaScript实现左侧菜单效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 基于打包工具Webpack进行项目开发实例

    基于打包工具Webpack进行项目开发实例

    这篇文章主要介绍了基于打包工具Webpack进行项目开发实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • uniapp小程序实战之利用腾讯地图获取定位

    uniapp小程序实战之利用腾讯地图获取定位

    使用uniapp是因为它是一个使用vue.js开发所有前端应用的框架,开发者编写一套代码,可以发布到ios,android,web以及各种小程序,快应用等多个平台,下面这篇文章主要给大家介绍了关于uniapp小程序实战之利用腾讯地图获取定位的相关资料,需要的朋友可以参考下
    2023-02-02
  • prototype class详解

    prototype class详解

    prototype class详解...
    2006-09-09
  • JavaScript实现数组对象转换为键值对的四种方式

    JavaScript实现数组对象转换为键值对的四种方式

    本文探讨了将包含 {icon: "abc", url: "123"} 形式对象的数组转换为键值对形式的四种方法,并从实现方式的简洁性、可读性和性能角度进行了分析比较,感兴趣的朋友可以参考下
    2024-02-02
  • JS按字节截取字符长度实例

    JS按字节截取字符长度实例

    这篇文章主要介绍了JS按字节截取字符长度实例,有需要的朋友可以参考一下
    2013-11-11
  • JS实现的适合做faq或menu滑动效果示例

    JS实现的适合做faq或menu滑动效果示例

    这篇文章主要介绍了JS实现的适合做faq或menu滑动效果,结合实例形式分析了基于JS实现的页面元素滑动渐变效果的相关实现技巧,需要的朋友可以参考下
    2016-11-11
  • JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】

    JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】

    这篇文章主要介绍了JavaScript创建对象方式,结合实例形式总结分析了工厂模式、构造函数模式、原型模式等各种常见的javascript对象创建方式与相关操作注意事项,需要的朋友可以参考下
    2018-12-12

最新评论