我是Javascript(以及一般编程)的新手,并且一直在寻找一种使用Javascript函数更改任意数量的aguments值的方法。
这里的答案(JavaScript variable number of arguments to function)非常有帮助。我能够用它来创建我需要的两个功能,但是我遇到了第三个功能。
基本上我想将一个可变数量的对象(原始的或更复杂的)传递给一个函数,并让函数改变每个对象的值。
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;
true
>house;
true
>hair;
Object
我如何制定这个功能,结果是:
>pants;
false
>house;
false
>hair;
false
非常感谢任何帮助!
修改
澄清事情 - 我正在尝试创建一个可重用的辅助函数,它可以更改传递给false
的任何对象的值,而不是输入:
var a1 = false;
var a2 = false;
...
var a+n = false;
如果我使用mathec的方法 - 是否有可能'解析'object
以便它的属性覆盖同名的全局变量,或者我是否坚持每次显式输入时间?
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
答案 0 :(得分:5)
当你在JavaScript中传递变量时,如果它是一个对象,你将一个引用的副本传递给一个值,但是如果它是一个原语(比如一个真/假),你就是在复制实际的值。这基本上意味着,如果您传入一个对象并修改其中一个对象的属性,您将修改原始对象。但是如果你传入一个像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");
但我想不出有这么好的理由:-)。我会使用配置对象来存储标志和状态变量,而不是全局变量。
答案 1 :(得分:1)
不幸的是,这不是直接可能的。
Javascript是一种按值传递的语言,在对象类型的情况下,它是通过引用传递的值(至少是我所看到的那样)
Is JavaScript a pass-by-reference or pass-by-value language?
深入了解它,https://stackoverflow.com/a/3638034/1093982特别有一个很好的答案。
这里有一个jsfiddle,演示了上面答案中的例子:
注意分配给参数的任何内容如何不进入上述范围。
答案 2 :(得分:0)
您可以尝试使用JavaScript的typeof()函数,该函数应返回“object”,然后在代码中对其进行不同的处理。至于更改对象的值,我认为你实际上想要更改属性的值,但我不确定我是否理解你的问题。
要更改对象属性,您可以执行以下操作。
hair.color = 'red';
如果要取消设置对象,可以执行此操作。
delete window.some_var;
答案 3 :(得分:0)
Javascript将每个参数作为引用按值传递,因此当您更改传入引用的值时,它会修改复制的值。
然而它确实有其他非常强大的东西,那就是关闭。在您的示例中,onFire
已经可以通过关闭范围访问pants
,house
和hair
,并且可以直接修改它们。
答案 4 :(得分:0)
当您在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
另一种方法是传递一个对象,其属性可以被修改,你只是不能改变作为参数传递的变量的值:
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
这些都不能实现你想要的,但如果我知道你要问的原因可能有更好的方法......