functionName(parameter1, parameter2, parameter3) { // 要执行的代码…… }
参数规则
JavaScript 函数定义时形参没有指定数据类型。
JavaScript 函数不会对实参的类型进行检测。
JavaScript 函数不会对实参的个数进行检测。
默认参数
如果调用函数时未传入足够多的实参,未提供的参数会被默认设置为: undefined.
所以我们最好为参数设置一个默认值。
function myFunction(x, y) { console.log(x); console.log(y); console.log(typeof y); y = y || 1; //为 y 参数设置默认值 console.log(y); } myFunction(2);
如果传入了 y 参数,y = y || 1 会返回 y;如果没有传入 y 参数,y = y || 1 会返回我们设置的默认值 1,因为 undefined 为 false.
JS不同于其他语言,方便起见它通过第一个值求 “||”,第一个值为“true”,则返回第一个值;第一个值为“false”,则返回第二个值。
Arguments 对象
如果调用函数时传入了过多的实参,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用实参。
JavaScript 函数有个内置的对象 arguments 对象。argument 对象包含了调用函数时传入的参数数组,它是一个类数组对象。
我们可以通过 arguments 对象的属性和方法让函数实现很多特殊的功能。
1、js不检测实参的个数,但是我们可以用 argument 对象的 length 属性检测实参的个数。
function add() { if( arguments.length == 2 ){ return arguments[0] + arguments[1]; }else{ return '传入的参数不合法'; } } console.log( add(2,3) ); console.log( add(1,2,3) );
2、重载函数。
js是一种弱类型的语言,没有重载机制,当我们重写函数时,会将原来的函数直接覆盖掉。
但是我们可以通过 arguments 对象判断传入实参的类型与数量,进行不同的操作,然后返回不同的数值,以实现重载。
function sumAll() { var i, sum = 0; for (i = 0; i < arguments.length; i++) { sum += arguments[i]; } return sum; } console.log( sumAll(1,2,3,4,5) ); //15 console.log( sumAll(1,3,5,7,9,11,13) ); //49
3、定义一个函数来连接字符串。
你可以传递任意数量的参数到该函数,第一个参数指定一个字符作为衔接点来连接字符串。
function myConcat(separator) { var args = Array.prototype.slice.call(arguments, 1); //从第二个参数开始将参数列表转换成参数数组 return args.join(separator); } var x = myConcat(", ", "red", "orange", "blue"); //"red, orange, blue" var y = myConcat("; ", "elephant", "giraffe", "lion", "cheetah"); //"elephant; giraffe; lion; cheetah" console.log(x); console.log(y);
附:转成数组的通用函数(可以将 arguments 对象转换成数组)
var toArray = function(s){ try{ return Array.prototype.slice.call(s); } catch(e){ var arr = []; for(var i = 0,len = s.length; i < len; i++){ //arr.push(s[i]); arr[i] = s[i]; //据说这样比push快 } return arr; } }
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments