【问题标题】:Overwriting arguments object for a Javascript function覆盖 Javascript 函数的参数对象
【发布时间】:2011-02-15 07:07:45
【问题描述】:

如果我有以下情况:

    // Clean input.
    $.each(arguments, function(index, value) {

        arguments[index] = value.replace(/[\W\s]+/g, '').toLowerCase();
    });

那会是一件坏事吗?我没有进一步使用函数中未清理的参数,最好不要创建arguments 的无用副本只是为了使用它们,但是这样做有什么负面影响吗?

理想情况下我会这样做,但我猜这会遇到问题,因为 arguments 并不是真正的数组:

    arguments = $.map(arguments, function(value) {

        return value.replace(/[\W\s]+/g, '').toLowerCase();
    });

感谢您的任何意见。

编辑:我刚刚意识到这两个现在都在它们自己的函数中,所以参数对象已经改变。有什么方法可以在不创建不必要的变量的情况下做到这一点?

【问题讨论】:

    标签: javascript jquery function arguments conventions


    【解决方案1】:

    我不会想到 arguments[i] = value; 可以工作,因为同样的原因(它不是一个真正的数组)。

    您确实应该考虑将清理后的值分配给一个新变量:

    var cleaned_args = $.map(arguments, function(value) {
        return value.replace(/[\W\s]+/g, '').toLowerCase();
    });
    

    这里没有必要引入一个新变量。大多数情况下,您不会直接对arguments 进行操作(因为它的缺点就像您已经发现的那样),而是先将其转换为真正的数组(无论如何这将涉及一个新变量)。

    关于您的编辑:

    对,第一个不行,因为arguments 引用匿名函数的参数。

    【讨论】:

    • 是的,您可以像更新形式参数的值一样更新 Arguments 对象中的值。 (它们是一回事。形式参数在内部映射到 Arguments 对象。)但是,如果 OP 最终想要将参数作为集合进一步操作,那么转换为带有 $.map 的数组是可行的方法。