JavaScript variable number of arguments to function

后端 未结 11 898
太阳男子
太阳男子 2020-11-22 02:14

Is there a way to allow \"unlimited\" vars for a function in JavaScript?

Example:

load(var1, var2, var3, var4, var5, etc...)
load(var1)
11条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2020-11-22 02:30

    While @roufamatic did show use of the arguments keyword and @Ken showed a great example of an object for usage I feel neither truly addressed what is going on in this instance and may confuse future readers or instill a bad practice as not explicitly stating a function/method is intended to take a variable amount of arguments/parameters.

    function varyArg () {
        return arguments[0] + arguments[1];
    }
    

    When another developer is looking through your code is it very easy to assume this function does not take parameters. Especially if that developer is not privy to the arguments keyword. Because of this it is a good idea to follow a style guideline and be consistent. I will be using Google's for all examples.

    Let's explicitly state the same function has variable parameters:

    function varyArg (var_args) {
        return arguments[0] + arguments[1];
    }
    

    Object parameter VS var_args

    There may be times when an object is needed as it is the only approved and considered best practice method of an data map. Associative arrays are frowned upon and discouraged.

    SIDENOTE: The arguments keyword actually returns back an object using numbers as the key. The prototypal inheritance is also the object family. See end of answer for proper array usage in JS

    In this case we can explicitly state this also. Note: this naming convention is not provided by Google but is an example of explicit declaration of a param's type. This is important if you are looking to create a more strict typed pattern in your code.

    function varyArg (args_obj) {
        return args_obj.name+" "+args_obj.weight;
    }
    varyArg({name: "Brian", weight: 150});
    

    Which one to choose?

    This depends on your function's and program's needs. If for instance you are simply looking to return a value base on an iterative process across all arguments passed then most certainly stick with the arguments keyword. If you need definition to your arguments and mapping of the data then the object method is the way to go. Let's look at two examples and then we're done!

    Arguments usage

    function sumOfAll (var_args) {
        return arguments.reduce(function(a, b) {
            return a + b;
        }, 0);
    }
    sumOfAll(1,2,3); // returns 6
    

    Object usage

    function myObjArgs(args_obj) {
        // MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
        if (typeof args_obj !== "object") {
            return "Arguments passed must be in object form!";
        }
    
        return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
    }
    myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old
    

    Accessing an array instead of an object ("...args" The rest parameter)

    As mentioned up top of the answer the arguments keyword actually returns an object. Because of this any method you want to use for an array will have to be called. An example of this:

    Array.prototype.map.call(arguments, function (val, idx, arr) {});
    

    To avoid this use the rest parameter:

    function varyArgArr (...var_args) {
        return var_args.sort();
    }
    varyArgArr(5,1,3); // returns 1, 3, 5
    

提交回复
热议问题