深入理解JavaScript中的传值与传引用

作者:半夏

时间:2026-10-27

浏览:222

本文详细解析JavaScript中变量传递的两种机制:传值与传引用。通过代码示例说明基本类型(如数字)采用传值,修改副本不影响原值;而对象类型采用传引用,传递的是对象地址。文章特别指出String类型的特殊性及其与Java中==运算符行为的差异,帮助开发者避免常见的引用错误。

文章目录

传值机制解析

1.传值(by value)

在传值机制中,变量的实际值会被复制一份传递给函数。这意味着新变量与原始变量互不影响:即使修改了新变量的值,原始变量的值也不会发生任何改变。在JavaScript中,所有基本数据类型(如Number、Boolean等)均采用传值方式传递。

代码如下:

function testPassValue()
{
var m=1;
var n=2;
//将m,n的值复制一份,传递到passValue
passValue(m,n);
alert(m); //将是原有的值
}
function passValue(a,b)
{
a = a+b; //改变a的值,这里a只是原有值的一份copy
alert(a);
}

输出结果:


3

1

传引用机制解析

2.传引用(by reference).

在传引用机制中,传递的是引用本身的一份副本,而非对象本身的复制(这与Java中的行为一致)。当在函数内部修改该引用所指向对象的属性时,由于副本引用和原始引用指向内存中的同一个对象,因此通过原始引用访问该对象时,会看到被修改后的值。

然而,如果仅在函数内部将副本引用重新指向一个新的对象,原始引用的值不会受到影响,改变的仅仅是副本引用所指向的位置。

代码如下:

function testPassValue()
{
var date = new Date(2006,02,27);
alert(date.getDate()); //输出为 27
//将date引用本身复制一份,传递到passReference,注意date所指向的对象并没有被复制
passReference(date);
alert(date.getDate()); //输出为12
//同上
changeReference(date);
alert(date.getDate()); //输出还为12
}
function passReference(da)
{
//由于da和原引用指向的是同一个对象,在function外,通过原有的引用访问到的将是对象的日期属性值,将是修改之后的值.
da.setDate(12);
}
function changeReference(da)
{
//此时da引用实际上是原引用的一份copy,将引用本身重新赋值,将不会影响原引用
da= new Date(2007,05,11);
//将da引用指向一个新的对象,此时原引用指向的还是原来的对象
 alert(da.getDate()); // 输出为11
}

3 特殊的String 

String类型的特殊性

在JavaScript中,String类型在传递时也遵循传引用的规则。需要注意的是,JavaScript中的String对象只有charAt等方法,而没有直接修改字符串内容的方法,这与Java中的String类似,都具有不可变性(immutability)。

代码如下:

var s1 = "hello";
var s2 = "hell" + "o";
if (s1 == s2)
alert("s1 = s2"); //这句会不会执行? java用的熟的人可能会认为不会执行(这句话我颇有微词,java中也是会执行的!),因为java中的==比较的是同一性. 事实上在js中对String==比较的是值是否相等,所以这句话会执行. 但是对其他的Object == 比较和java中一样是同一性.

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章