返回
浅析JavaScript 中的 arguments
前端
2024-01-18 12:09:11
<HTML>
<BODY>
## JavaScript 中的 arguments
arguments 是 JavaScript 中一个对应于传递给函数参数的类数组(array-like)对象。它长得像数组,但是并不是数组,本质上是个对象。
### arguments 的特性
* arguments 是一个类数组对象,这意味着它具有与数组相似的属性和方法,如 length、[]、push() 和 pop()。
* arguments 的 length 属性表示传递给函数的参数个数。
* arguments[index] 可以访问传递给函数的第 index 个参数。
* arguments 可以被迭代,就像数组一样。
### arguments 的用法
arguments 可以用在各种场合,例如:
* 在函数内部访问传递给函数的参数。
* 在函数内部动态地改变传递给函数的参数。
* 在函数内部创建新的参数对象。
* 在函数内部调用其他函数,并传递参数。
### arguments 的注意事项
* arguments 不是真正的数组,因此它没有数组的某些属性和方法,如 sort() 和 reverse()。
* arguments 是一个只读对象,这意味着它的值不能被直接修改。
* arguments 对象在函数调用结束后就会被销毁,因此不能在函数外部访问它。
### 浏览器中的 arguments
在浏览器中,arguments 对象还可以用来访问以下内容:
* 传递给 window.onload() 函数的参数。
* 传递给 window.onunload() 函数的参数。
* 传递给 DOM 事件处理程序的参数。
### 字符串、数组、函数和 arguments
* 字符串、数组和函数都是对象,但它们不是 arguments 对象。
* arguments 对象是一个类数组对象,它长得像数组,但本质上是对象。
* arguments 对象可以通过 [] 语法访问传递给函数的参数,也可以通过 length 属性获取传递给函数的参数个数。
* arguments 对象不能被修改,因为它是一个只读对象。
* arguments 对象在函数调用结束后就会被销毁,因此不能在函数外部访问它。
### 传值、传址和 arguments
* 在 JavaScript 中,参数传递是按值传递的,这意味着传递给函数的参数是值的拷贝。
* 如果函数内部修改了参数的值,不会影响到函数外部的变量。
* arguments 对象是一个例外,它不是按值传递的,而是按址传递的,这意味着传递给函数的 arguments 对象是函数外部变量的引用。
* 如果函数内部修改了 arguments 对象的值,也会影响到函数外部的变量。
### 拷贝 arguments 对象
如果想在函数内部修改 arguments 对象的值,而不影响函数外部的变量,可以先拷贝 arguments 对象。
```javascript
function foo() {
var args = Array.prototype.slice.call(arguments);
args[0] = 100;
}
var a = 1;
foo(a);
console.log(a); // 1
在上面的例子中,foo() 函数先将 arguments 对象拷贝到 args 变量中,然后修改 args[0] 的值。由于 args 是 arguments 对象的拷贝,因此修改 args[0] 的值不会影响到函数外部的变量 a。