下面的Javascript函数是通过值还是通过引用传递参数?我不知道如何区分这两者

Is the below Javascript function being passed arguments by value or by reference? I'm not sure how to distinguish between the two

本文关键字:我不知道 何区 参数 引用 Javascript 函数      更新时间:2023-09-26

我不能弄清楚什么是按引用传递和按值传递(我知道它们在理论上是什么意思)。你能告诉我下面的函数是否通过值或引用传递参数吗?顺便说一下,这是我的第一篇文章:)

var number_1 = 32;
var number_2 = 43;
function addition(num1,num2) {
    alert (num1*num2) ;
}
addition(number_1,number_2); /*is this passing by reference?*/

原始类型

在javascript中,数字,字符串,布尔值属于基本类型。当这些类型作为参数传递给函数时,在函数作用域中创建一个单独的副本,对外部作用域

没有影响。例如

var number_1 = 32;
var number_2 = 43;
addition(32,43);
//number_1 is 32 here
//number_2 is 43 here
function addition(number_1,number_2) {
    number_1 += 1; // number_1 is 33
    number_2 += 1; // number_2 is 44
}

引用类型

引用类型略有不同

看下面的例子

var obj = new Object();
fn(obj);
function fn(object){
  object.property = "test";
  //obj.property is "test"
  object = new Object();
  object.property = "test 2";
  //obj.property is still "test"
  //obj.property should have changed to "test 2", 
  //if it had been passed by reference
}

如果通过引用传递,则obj.property应该在fn内部的最后一条语句之后更改为"test 2",但它没有。因此,当向函数传递引用值时,将传递指向该对象的指针的单独副本。

在javascript中,每个变量都是通过值而不是引用传递的,但对于对象有一个例外。对象是引用(就像这里回答的那样)。

意味着一个数字,一个字符串,一个布尔值或一个函数在你把它们作为一个函数的参数后不会改变。但是,对象或数组中的属性和元素如果在函数中被更改,则会发生变化。

下面是一个例子


简单变量
function nullify(a) 
{
   a = null;
}
var myVariable = 123;
nullify(myVariable); // myVariable still equals to 123

function changeProperty (obj)
{
   obj.key = null;
}
var myObject = new Object();
myObject.key = "value";
changeProperty(myObject); // the property key is null after calling the function

数组
function changeArray (Arr)
{
   Arr[0] = null;
}
var myArray = [1,2,3];
changeArray(myArray); // now the value of myArray is [null,2,3]