Javascript函数,它接受可变数量的参数 - 更改它们的值 - 然后返回它们
Javascript function that takes variable number of arguments - changes their value - and then returns them
我是Javascript(以及一般的编程(的新手,并且一直在寻找一种使用Javascript函数更改任意数量agument的值的方法。
这里的答案(JavaScript 函数参数的可变数量(非常有帮助。我能够使用它来创建我需要的两个函数,但是我在第三个函数上遇到了麻烦。
基本上,我想将可变数量的对象(原始或更复杂的对象(传递到一个函数中,并让函数更改每个对象的值。
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
当你在 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");
但是我想不出这样做的充分理由:-(。我会使用配置对象来存储标志和状态变量,而不是全局变量。
不幸的是,这并不直接可行。
Javascript是一种按值传递的语言,在对象类型的情况下,它是按引用传递的值(至少我是这样
认为的(JavaScript 是按引用传递还是按值传递语言?
非常深入地介绍了它,特别是 https://stackoverflow.com/a/3638034/1093982 有一个很好的答案。
下面是一个JSFIDDLE,演示了上面答案中的示例:
http://jsfiddle.net/hjPHJ/
请注意,分配给参数的任何内容都不会带入上述范围。
你可以尝试JavaScript的typeof((函数,它应该返回"object",然后在代码中以不同的方式处理它。至于更改对象的值,我认为您实际上想要更改属性的值,但我不确定我是否足够理解您的问题。
要更改对象属性,您需要执行以下操作。
hair.color = 'red';
如果要取消设置对象,可以执行此操作。
delete window.some_var;
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
另一种方法是传递一个对象,其属性可以修改,您只是无法更改作为参数传递的变量的值:
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
这些都不能达到你想要的,但如果我知道做你要求的原因,可能会有更好的方法......
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- 我如何才能继续'如果'语句来比较作为参数的多个函数返回值
- 仅使用特定参数返回特定值
- 当我将参数设置为对象时,JavaScript返回TypeError
- 为什么Coderbyte.com's的Javascript模板喜欢返回函数的原始参数
- 为什么我需要使用函数作为参数,并且可以'不要只使用它返回的值
- 如何从两个参数函数返回随机整数
- 提交输入类型=“;图像“;到另一个servlet时,未能返回任何参数
- Javascript-如何通过以字符串作为参数返回数组
- 如何将jQuery中某个函数的字符串作为参数返回给另一个jQuery函数
- JS函数返回函数供以后使用-未定义参数
- 如何从批处理文件调用一个带有2个参数的java脚本函数,并将结果返回到环境变量
- JavaScript 窗口['func'],参数返回 undefined 而不是函数
- 弹出窗口将参数返回给父级
- JavaScript unshift 参数返回意外结果
- Angular UI Router-子状态和父状态中的参数返回错误的模板
- 可以从Javascript函数参数返回一个值
- 强制传递一个匿名函数,该函数将对象作为javascript中的参数返回
- javascript块中的XSLT参数返回不正确的值
- 带参数的调用函数和带其他参数返回值的调用函数有什么不同