arguments 对象如何在内部工作?
How arguments object works internally?
如下面的 JS 片段所示,arguments[0]
和 a
的值始终保持相同的值。这在 JS 中是众所周知的,但我仍然很好奇这是如何实现的。
例如,如果 a
和 arguments[0]
都引用同一个 JS 对象,那么它们总是获得更新的值是可以理解的。但这不能解释像 1 这样的原始值的情况。
如果我理解正确的话,JS 总是复制基元的值,这意味着 a
和 object[0]
都持有这个值的副本。如果是这种情况,a
和 arguments[0]
如何始终同步?
在此先致谢:)
function func(a, b) {
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
arguments[0] = 123;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
a = 123456;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
}
func(1, 2);
这是输出:
>node test.js
a = 1
arguments[0] = 1
a = 123
arguments[0] = 123
a = 123456
arguments[0] = 123456
arguments
对象很特殊,它挂钩到 Javascript 实现存储函数参数的方式。所以当你赋值给 arguments[n]
时,它实际上找到了用于保存参数变量的内存块,并将你赋值的值放在那里。当按名称引用参数变量时,也会使用相同的内存位置。
另一种思考方式是每个函数都有一个本地 arguments
类数组对象。当 JS 实现编译函数定义时,它将所有参数变量替换为对该数组的引用。因此,使用 a
的表达式被编译为就好像它们使用了 arguments[0]
,b
被转换为 arguments[1]
,依此类推。
"The arguments object is an Array-like object corresponding to the arguments passed to a function." 来自 MDN: Arguments object
为简单起见,只要想一想。
function func(a, b) {
// imagine this line of code gets automatically added
// var arguments = [a, b];
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
arguments[0] = 123;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
a = 123456;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
}
如下面的 JS 片段所示,arguments[0]
和 a
的值始终保持相同的值。这在 JS 中是众所周知的,但我仍然很好奇这是如何实现的。
例如,如果 a
和 arguments[0]
都引用同一个 JS 对象,那么它们总是获得更新的值是可以理解的。但这不能解释像 1 这样的原始值的情况。
如果我理解正确的话,JS 总是复制基元的值,这意味着 a
和 object[0]
都持有这个值的副本。如果是这种情况,a
和 arguments[0]
如何始终同步?
在此先致谢:)
function func(a, b) {
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
arguments[0] = 123;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
a = 123456;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
}
func(1, 2);
这是输出:
>node test.js
a = 1
arguments[0] = 1
a = 123
arguments[0] = 123
a = 123456
arguments[0] = 123456
arguments
对象很特殊,它挂钩到 Javascript 实现存储函数参数的方式。所以当你赋值给 arguments[n]
时,它实际上找到了用于保存参数变量的内存块,并将你赋值的值放在那里。当按名称引用参数变量时,也会使用相同的内存位置。
另一种思考方式是每个函数都有一个本地 arguments
类数组对象。当 JS 实现编译函数定义时,它将所有参数变量替换为对该数组的引用。因此,使用 a
的表达式被编译为就好像它们使用了 arguments[0]
,b
被转换为 arguments[1]
,依此类推。
"The arguments object is an Array-like object corresponding to the arguments passed to a function." 来自 MDN: Arguments object
为简单起见,只要想一想。
function func(a, b) {
// imagine this line of code gets automatically added
// var arguments = [a, b];
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
arguments[0] = 123;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
a = 123456;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
}