gpt4 book ai didi

javascript - 使用参数数组更改 JavaScript 函数的参数值不起作用

转载 作者:IT王子 更新时间:2023-10-29 03:12:43 24 4
gpt4 key购买 nike

我正在学习 JavaScript,对 arguments 属性数组感到很困惑。

我有一个接受单个参数并返回它的函数。当我传递参数并使用 arguments[0] = value 重新分配它时,它正在更新值。

function a(b) {
arguments[0] = 2;
return b;
}
console.log(a(1)); //returns 2

但是当我不带参数调用同一个函数时,它返回 undefined

function a(b) {
arguments[0] = 2;
return b;
}
console.log(a()); //returns undefined

但即使我传递 undefined,该值也会更新。

function a(b) {
arguments[0] = 2;
return b;
}
console.log(a(undefined)); //returns 2

我认为如果你不向 JavaScript 函数传递参数,它会自动创建它并将值赋给 undefined 并且在更新后它应该反射(reflect)更新后的值,对吧?

还有 a()a(undefined) 是一回事吧?

最佳答案

分配给 arguments 索引只会更改关联的参数值(我们称它为第 n 个参数)如果函数被调用至少 n 参数。 arguments 对象的数字索引属性本质上是 setter(和 getter):

http://es5.github.io/#x10.6

下面的斜体字是我对这个过程如何与问题相关的评论:

(Let) args (be) the actual arguments passed to the [[Call]] internal method

  1. Let len be the number of elements in args.

  2. Let indx = len - 1.

  3. Repeat while indx >= 0, (so, the below loop will not run when no arguments are passed to the function:)

(assign to the arguments object being created, here called map:)

    1. Add name as an element of the list mappedNames.
    1. Let g be the result of calling the MakeArgGetter abstract operation with arguments name and env.
    1. Let p be the result of calling the MakeArgSetter abstract operation with arguments name and env.
    1. Call the [[DefineOwnProperty]] internal method of map passing ToString(indx), the Property Descriptor {[[Set]]: p, [[Get]]: g, [[Configurable]]: true}, and false as arguments.

因此,如果不带参数调用该函数,arguments[0] 上将不会有 setter,因此重新分配它不会更改索引 0 处的参数。

同样的事情也会发生在其他指标上——如果你用 1 个参数调用一个函数,但是这个函数接受两个参数,分配给 arguments[1] 不会改变第二个参数,因为 arguments[1] 没有 setter:

function fn(a, b) {
arguments[1] = 'bar';
console.log(b);
}
fn('foo');

所以

a() and a(undefined) are the same thing right?

不是这种情况,因为第二个结果是一个 arguments 对象,在索引 0 上有一个 setter 和一个 getter,而第一个不是。

请注意,arguments 和函数参数之间的这种奇怪交互仅出现在草率模式中。在严格模式下,对 arguments 的更改不会对单个参数标识符包含的值产生任何影响:

'use strict';
function a(b) {
arguments[0] = 2;
return b;
}
console.log(a(1)); //returns 1

关于javascript - 使用参数数组更改 JavaScript 函数的参数值不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com