Javascript函数,该函数接受可变数量的参数-更改参数的值-然后返回参数

Javascript函数,该函数接受可变数量的参数-更改参数的值-然后返回参数,javascript,function,arguments,Javascript,Function,Arguments,我对Javascript(以及一般的编程)是新手,一直在寻找一种方法来使用Javascript函数更改任意数量aguments的值 这里的答案()非常有用。我可以用它来创建我需要的两个函数,但第三个函数有问题 基本上,我希望将数量可变的对象(基本对象或更复杂的对象)传递到函数中,并让函数更改每个对象的值 var pants = true; var house = true; var hair = {/* lots of stuff */}; var onFire = function() {

我对Javascript(以及一般的编程)是新手,一直在寻找一种方法来使用Javascript函数更改任意数量aguments的值

这里的答案()非常有用。我可以用它来创建我需要的两个函数,但第三个函数有问题

基本上,我希望将数量可变的对象(基本对象或更复杂的对象)传递到函数中,并让函数更改每个对象的值

var pants = true;
var house = true;
var hair = {/* lots of stuff */};

var onFire = function() {
        for (var i = 0; i < arguments.length; i++) {
            arguments[i] = false;
        }
};

onFire(pants, house, hair);
我如何表述此函数,以使结果为:

>pants;
 false

>house;
 false

>hair;
 false
任何帮助都将不胜感激

编辑:

为了澄清问题,我正在尝试创建一个可重用的helper函数,将传入的任何对象的值更改为
false
,而不是键入:

var a1 = false;
var a2 = false;
...
var a+n = false;
如果我使用的方法-是否可以“解析”
对象
,使其属性覆盖相同名称的全局变量,还是每次都要显式键入

var object = {
    pants: {/* lots of stuff */},
    house: {/* lots of stuff */},
    hair: {/* lots of stuff */}
};

function modifyObject(obj) {
    obj.pants = false;
    obj.house = false;
    obj.hair = false;
}

function someMagic(object){
    // wand waves...
    // rabbit exits hat....
}
控制台输出:

>pants;
 false

>house;
 false

>hair;
 false 

不幸的是,这不可能直接实现

Javascript是一种传递值语言,对于对象类型,它是一种通过引用传递值的语言(至少我看到它是这样引用的)

非常深入地讨论了它,特别是有一个很好的答案

下面是一个JSFIDLE,演示了上述答案中的示例:


请注意,分配给参数的任何内容都不会包含在上述范围内。

您可以尝试JavaScript的typeof()函数,该函数应返回“object”,然后在代码中对其进行不同的处理。至于改变一个物体的价值,我认为你实际上想改变一个属性的价值,但我不确定我是否足够理解你的问题

要更改对象属性,可以执行以下操作

hair.color = 'red';
如果要取消设置对象,可以执行此操作

delete window.some_var; 

当您在JavaScript中传递变量时,如果某个值是对象,则传递该值的引用副本;如果该值是原语(如true/false),则传递的是实际值。这基本上意味着,如果传入一个对象并修改该对象的一个属性,则将修改原始对象。但是,如果您传入一个像true/false这样的基元,那么您只是在修改副本,而不是原始值。因此,如果您的目标是修改原始值,一个选项是将这些值存储在对象中,然后传入对象。例如:

var object = {
    pants: true,
    house: true,
    hair: {}
};

function modifyObject(obj) {
    obj.pants = true;
    obj.house = true;
    obj.hair = true;
}
如果要修改任意数量的参数,请记住,如果传入true/false,就是在复制这些值。因此,如果在函数中更改它们,就不会修改原始值

记住这一点的一个快速方法是,如果您传递了一个对象或数组,那么您就是在修改实际对象。其他任何东西,你都在修改副本

编辑

因此,从字面上解释你想做的事情,你可以这样写:

var a = true,
    b = true;

/* pass in variable names */
function makeFalse() {
   var i, len;

   for (i = 0, len = arguments.length; i < len; ++i) {
     window[arguments[i]] = false;
   }
 }

 makeFalse("a", "b");
var a=true,
b=正确;
/*传入变量名*/
函数makeFalse(){
变量i,len;
for(i=0,len=arguments.length;i

但我想不出这样做的好理由:-)。我将使用配置对象来存储标志和状态变量,而不是全局变量。

Javascript通过值将每个参数作为引用传递,因此当您更改传入引用的值时,它会修改复制的值


然而,它确实有一些非常强大的东西,那就是结束。在您的示例中,
onFire
已经可以通过闭包范围访问
pants
house
hair
,并可以直接修改它们。

在javascript中调用函数时,您传递的是值,而不是对原始对象的引用。有两种方法可以做您想做的事情,但不能直接通过将每个值传递给函数来进行更改

首先,您可以传递一个数组:

function onFire(arr) {
    for (var i = 0; i < arr.length; i++) {
        arr[i] = false;
    }
}

arr = [true, true, {}];
onFire(arr); // arr[0] through arr[2] are now false

这两种方法都不能满足您的要求,但如果我知道执行您要求的操作的原因,可能会有更好的方法…

很好的解释,唯一的例外是修改对象变量本身不会起任何作用,但修改其属性会起作用。感谢您的澄清!我发现一个很好的思考方法是变量标签或名称与它们所指向的值是分开的。变量名在函数中始终是分开的。如果你在函数中重新分配变量,你就是在重新分配局部变量。如果你能举个例子,我可能会给出一些你可以使用的其他模式?听起来像是试图用属性初始化对象,但还不确定…..我的目标是避免键入var a_1=false,var a_2=false…var a_n=false。如果我在您的示例中使用该方法,是否有办法在“modifyObject()”更改“object”的值后解析它,从而使修改后的“hair”覆盖原始的“hair”对象?我只是从字面上理解一下您的示例,但如果您希望所有变量最初都为false,则不必将它们初始化为任何值。因为“undefined”是所有变量的开头形式,而在if语句中,undefined的计算结果为“false”。所以var a_1;如果(a_1)为假。这只是对你想做什么的一点猜测,如果太离谱了,很抱歉。初始化对象的另一种方法是使用构造函数。我可以举一些例子来说明它的帮助。我把注意力集中在物体上。正如mathec所指出的,您不能以这种方式更改基本变量,但可以将它们作为单个对象传递。
function onFire(arr) {
    for (var i = 0; i < arr.length; i++) {
        arr[i] = false;
    }
}

arr = [true, true, {}];
onFire(arr); // arr[0] through arr[2] are now false
function onFire(obj) {
    obj.pants = false;
    obj.house = false;
    obj.hair = false;
}

onFire( { pants: true, house: true, hair: { } } );
// obj.pants, obj.house and obj.hair are now false