函数重载要依赖于两点:判断传入参数数量的能力和判断传入参数类型的能力。
JS函数的参数列表,参数仅在函数内有效。参数列表是一个伪数组,可以访问其中的元素,具有.length属性,但是不能push()。
<script language="javascript" type="text/javascript">
function sendMessage(msg, obj) {
if (arguments.length == 2) {
obj.handleMsg(msg); //参数为函数的第一个参数
}
else {
alert(msg);
}
}
sendMessage("hello,javascript!"); //输出hello,javascript!
//将我们写好的对象传入,用handleMsg方法调
sendMessage("hello", {
handleMsg: function(msg) { //此处方法必须和obj.handleMsg相同
alert("print: " + msg);
}
}
);
//--------------------------------------
//一个接受任意数量参数,并将参数转化为数组的函数
function makeArray() {
var arr = [];
for (var i = 0; i < arguments.length; i++) {
arr.push(arguments[i]);
}
return arr;
}
//将makeArray函数实例化,并输出数组的每个值
function printArray() {
var array = makeArray("asd", "42", 90, "bj", 900);
for (var i = 0; i < array.length; i++) {
alert(array[i]);
}
}
printArray();
//------------------------------------
//在函数中判断参数类型的时候,如果没有参数,那么其类型必定为undefined.
function displayError(msg) {
if (typeof msg == undefined) {
msg = "undefined";
}
msg = typeof msg;
alert(msg);
}
displayError("rxm");
//------------------------------------
//判断类型的时候有两张方法,
//一:typeof eg:typeof msg[当变量不是object或array时,这种方法很完美]
//二:引用所有JS对象都拥有的一个属性,这个属性引用的是构造该对象时候的函数[构造函数]
var msg = "rxm,ru,rem";
var arr = new Array();
if (msg.constructor ==
String) {
arr = msg.split(","); //如果变量是字符串,将其切成数组
}
//------------------------------------
//用变量类型列表检查参数列表
function strict(types, args) {
if (types.length != args.length) {
throw "变量参数的个数与函数列表不符!";
}
for (var i = 0; i < args.length; i++) {
if (args[i].constructor != types[i]) {
throw "参数类型不符要求!";
}
}
}
function book(name, price, content) {
strict([String, Number, Array], arguments);
for (var i = 0; i < content.length; i++) {
alert(content[i]);
}
}
// book("", "", "sd");//抛出异常
book("语文", 90, ["春", "夏", "秋", "冬"]);
</script>