当前位置: 首页 > 编程笔记 >

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

谭志用
2023-03-14
本文向大家介绍js的函数的按值传递参数(实例讲解),包括了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的函数的按值传递参数(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍JS中min函数实例讲解,包括了JS中min函数实例讲解的使用技巧和注意事项,需要的朋友参考一下 我们先来看一下min函数的基本语法   Value1,Value2,……:传递到math.min()函数的值,用于查找最小值。 我们下面来看具体示例 代码如下 参数是正数和负数时: 代码如下 执行结果如下: 没有参数传递时 代码如下: 执行结果如下 当参数中有参数无法转换为数字时: 代码

  • 问题内容: 只是一个关于如何在Java中传递参数的快速问题… 在这种情况下,stdout和stderr(用作tidy()中的参数)的值是否会更改为新的StringBuffer(buffer.substring(i))?我的假设是,它们将作为对象变量(对象指针)始终按值传递吗? 问题答案: 您错报了这里发生的事情-对象引用按值传递(创建了引用的副本),因此调用tidy时 不会 修改stdout和st

  • 以下是我正在努力做的: 在WordPress中,我通过wp_localize_script()将一个变量从php传递到外部javascript文件,这部分似乎可以工作,但我想在jQuery函数中使用变量值作为键控参数。 使用alert,正确的值似乎被传递给javascript,但我不知道如何在函数的参数中引用它们。(特别是WideSliderParams.slideshow和speed。) 这里是

  • 问题内容: 我迷失在通用丛林中,请帮助我:)我有这样的事情: 据我认为,编译器应该实现,因为它实现了。 为什么会出现此错误? 我该如何工作? ps:如果您对此有更好的标题,请进行更改。我无法弥补。 问题答案: 问题是,您的构造函数需要一个,并且在您的代码中将其推断为。 因此,您应该通过,然后通过。但是您不能像那样直接传递该实例。 但是,您可以通过将类强制转换为所需实例来解决此问题: 请注意,如何首

  • 考虑这个简单的程序: 当我写的时候,我希望得到: 13 42 13 42 13 42 但是我得到的是: 13 42 0 42 0 42 当然,问题在于通过引用来吸收最后2个参数。因此,如果它们中的任何一个碰巧在正在操作的范围内,则结果可能是意外的。我可以通过添加一个临时变量来解决这个问题: 我知道C 11为我们提供了各种类型的工具,我是否可以简单地将这个值强制为非引用类型并内联传递,而不创建临时类