JavaScript 引用机制与函数重载实现详解
本文深入解析JavaScript中的引用机制,阐明对象、数组及字符串在内存中的引用行为差异。重点讲解如何利用arguments对象判断参数数量,以及结合typeof和constructor属性实现类型判断,从而在JavaScript中模拟实现函数重载功能,提升代码灵活性。
JavaScript引用机制解析
引用本质上是一个指向对象实际存储位置的指针。以下示例展示了引用的具体用法:
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
在此示例中,两个变量指向同一个对象实例。因此,修改其中一个对象的属性时,另一个对象也会受到相应影响。
接下来通过数组示例进一步说明引用概念:
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
如果变量arr被重新赋值定义,原有的引用关系将不再指向原对象,具体代码逻辑如下:
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
随后探讨一个较为特殊的场景,即字符串类型的引用行为。
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
如示例所示,执行字符串操作时,JavaScript总会返回一个新的字符串对象,而不会直接修改原字符串。
《JavaScript高级程序设计》中有一节专门讲解“传值和传址”,其核心概念即为引用。建议读者查阅相关章节以加深理解。
JavaScript通过维护一系列对其他对象的引用来运作,这种机制为程序提供了极大的灵活性。
2,函数重载
基于arguments与类型的函数重载实现
函数重载的核心在于根据传入参数的数量或类型不同,执行不同的功能逻辑。实现这一特性主要依赖两点:一是判断传入参数的数量,二是判断传入参数的类型。
2-1,判断传入参数的数量
JavaScript中的每个函数都包含一个名为arguments的变量,该变量仅在函数作用域内有效。它是一个包含所有传入参数的伪数组,具备length属性。
通过访问arguments对象,我们可以获取到这些参数。示例如下:
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
arguments是一个非常有用的内置对象。参考以下功能函数,它能够将任意数量的参数转换为真正的数组:
<script type="text/javascript"> function makeArr(){ var arr = [];//定义一个临时数组 for(var i=0;i [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
2-2,判断传入参数的类型
第一种判断类型的方法:
判断类型需使用JavaScript中的typeof操作符。该操作符用于返回变量内容的类型字符串,例如,若变量为字符串,typeof运算后将返回"string"。
常见的类型判断代码如下:
代码如下:
if( typeof num == "string" ){
num = parseInt( num );//如果是一个字符串,则把字符串解析出整数
}
if( typeof arr== "string" ){
arr= arr.split(",");//如果是一个字符串,则根据逗号来分割成数组
} 例如,将前述makeArr()函数修改为仅接受字符串类型参数的版本,代码如下:
<script type="text/javascript"> function makeArr(){ var arr = [];//定义一个临时数组 for(var i=0;i [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
最终结果a.length为2,因为后续的两个参数属于number类型。
第二种判断类型的方法:
此方法需利用所有JavaScript对象共有的constructor属性,该属性指向构造该对象的原始函数。
代码如下:
if( num.constructor == String ){
num = parseInt( num );//如果是一个字符串,则把字符串解析出整数
}
if( arr.constructor == String ){
arr= arr.split(",");//如果是一个字符串,则根据逗号来分割成数组
}
if( newArr.constructor == Array ){
newArr = newArr.join(",");//如果是一个数组,则根据逗号来组成字符串
} 执行constructor后的结果是一个对象,而执行typeof后的结果是一个字符串。对比如下表所示:
| 变量 | typeof 变量 | 变量.constructor |
| {a:"b"} | "object" | Object |
| ["a","b"] | "object" | Array |
| function(){} | "function" | Function |
| "a" | "string" | String |
| 66 | "number" | Number |
| true | "boolean" | Boolean |
| new User() | "object" | User |
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28
