下面的Javascript函数是按值传递还是按引用传递的?我不确定如何区分两者。

4

我不知道按引用传递和按值传递是什么样子的(我知道它们在理论上的意义)。你能告诉我下面这个函数是按值传递还是按引用传递参数吗?顺便说一句,这是我的第一篇文章 :)

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?*/

2
从技术上讲,JS 中的所有内容都是按值传递的,但对于对象来说,该值是对对象的引用。在您的情况下,这是数字值的简单副本。 - cookie monster
1
所有 JavaScript 中的内容都是按值传递的。 - Prabhu Murthy
1
传递引用在其他语言中更为常见,而在Javascript中并不常见。在Javascript中,每个变量都是原始类型(数字、布尔值、字符串)或对象。数组只是内置于语言中具有特殊语法的对象。 - Shashank
有人能给我两个简单的例子,同时演示按引用和按值传递参数吗?我知道JavaScript只允许按值传递,但我不明白它在我的代码中是如何工作的。按引用传递参数难道不意味着传递一个变量而不是一个原始值吗? - user3918807
2个回答

5

原始类型

在JavaScript中,数字、字符串和布尔值属于原始类型(primitives)。当这些类型作为参数传递给函数时,函数内部会创建一个副本,不会影响外部作用域。

例如:

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",但实际上没有发生变化。因此,在将引用值传递给函数时,会传递指向对象的指针的单独副本。

谢谢。所以基本上我所做的是传值吗?我认为按值传递意味着传递原始值,例如“thisisastring”,而像number_1这样传递变量则意味着按引用传递。 - user3918807
是的,正确。你传递的是值,这就是它的工作方式。 - Prabhu Murthy

-1
在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]

@minitech 我没有说它们是按引用传递的。 - Khalid
好的,但这并不是一个例外。更改属性与将新值分配给变量完全不同。原始数据类型是不可变的。 - Ry-
我完全不这么认为。 - Ry-
这与给变量赋新值完全不同。我所说的恰恰是 var x = {}; nullify(x); 这个例子的相反情况。 - Ry-
1
串行地对我进行负评并不具有创造性。此外,想象一下你本可以把那些时间用来修正你的回答! - Ry-
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接