JavaScript 字符串的引用传递与值比较机制解析

作者:闭包旅人

时间:2026-10-26

浏览:586

本文深入解析JavaScript中字符串类型的复制与比较行为。字符串在复制和函数传递时遵循引用机制,共享同一内存地址;但在相等性比较时,原始字符串值按内容比较,而String对象实例则按引用地址比较。通过代码示例展示new String()与普通字符串在===运算符下的不同表现,帮助开发者避免常见的类型混淆错误。

文章目录
按值和按引用的比较

基本类型与复杂类型的复制传递机制

数字(Numbers)和布尔值(Boolean,包括 true 和 false)在 JavaScript 中是按值进行复制、传递和比较的。当执行按值的复制或传递操作时,系统会在内存中分配一块新的空间,并将原始值完整复制到该区域。因此,即使后续修改了原始变量的值,已复制的值也不会受到影响,反之亦然。这是因为在内存中,这两个值被视为完全独立的实体,互不干扰。



对象(Object)、数组(Array)以及函数(Function)则是按引用进行复制、传递和比较的。当执行按引用的复制或传递操作时,系统实际上创建的是一个指向原始数据项的指针(引用),而非数据的副本。后续对该指针的使用方式类似于拷贝,但它始终指向原始数据。因此,如果原始数据发生更改,通过引用访问该数据的变量也会反映出变化,因为“副本”并非独立实体,而是原始数据的另一个引用入口。



在进行按引用的比较时,要使比较结果为真,两个变量必须指向内存中完全相同的实体。例如,即使两个不同的 Array 对象包含完全相同的元素,它们在使用严格相等运算符比较时也会返回 false,因为它们指向不同的内存地址。要使比较成功,其中一个变量必须是另一个变量的直接引用。若需检查两个数组是否包含相同的元素内容,应通过比较它们的 toString() 方法返回的结果来实现。



字符串的特殊比较行为

字符串(String)类型具有特殊性:它在复制和传递时遵循引用机制,但在比较时遵循值机制。需要注意的是,如果使用 new String("something") 语法创建了两个 String 对象,它们在比较时将按引用进行(即比较内存地址)。然而,如果参与比较的变量中至少有一个是原始字符串值(primitive string),则比较将按值进行(即比较字符串内容)。



字符串在复制和传递时是按引用的,但在比较时是按值的。特别地,如果使用 new String("something") 显式创建了两个 String 对象,它们在比较时会按引用进行判断。但是,如果参与比较的变量中有一个或两个是原始字符串值(而非对象),则比较将按值进行,即比较字符串的实际内容。


代码示例与验证

具体实现代码如下:

 
var str1="aa";
var str2=new String("aa");
var str3=str2;
function test(p){
var str4=p;
console.log(str4===str2);
} 
console.log(str1===str2); //false
console.log(str3===str2); //true
test(str1);//false
test(str2);//true

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章