精通JavaScript —— 函数重载和类型检查

 

其它面向对象的语言如JAVA的一个常见特性是,根据传入的不同数量或类型的,通过重载(overload) 来发挥不同的功用。尽管这个特性在JavaScript中并没有直接支持,也有很多办法能够实现。

函数重载(function overloading)必须依赖两件事情:判断传入参数的数量的能力和判断传入参数类型的能力。

JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量(contextual variable

称为参数(argument),它是一个包含所有传给参数的伪数组(pesudo-array),所以它并非真正意义上的数组(也就是说你不能修改它,也不能用push来刷新它),但是可以访问其中的元素,它也具有length属性。

例子:JavaScript中函数重载的两个例子

  <script>

function sendMessage(msg,obj){

// 如果消息和对象的参数都被提供

if(arguments.length == 2){

// 给对象发送消息

obj.handleMsg(msg);

}else

alert(msg); // 否则仅显示默认的错误信息

}

sendMessage("hello world!"); // 仅传递一个参数,显示错误的提示信息

// 输出结果为:警示框 hello world

/*又或者我们可以将一个我们自己写好的对象传入,负责用另一套办法显示信息*/

sendMessage("how are you?" , {

handleMsg: function(msg) {

alert("This is a custom message:" + msg);

}

});

// 输出结果为:警示框 This is a custom message how are you?

/*

var obj = new Object();//创建一个新对象并将其存放在obj里 

obj.val = 5;           //将该对象的一些属性设置成不同的值 

obj.click = function(){ 

alert( "hello" ); 

}; 

//下面是等效的代码,使用了{...}式缩写, 

//和定义对象属性的"名称-值"对 

var obj = { 

//用名称-值对设置对象属性 

val: 5, 

click: function(){ 

alert( "hello" ); 

}; 

*/

// 一个接受任意数量参数,并转化为数组的函数

function makeArray() {

var arr = [] ; // 临时使用的数组

for(var i=0; i<arguments.length; i++){

arr.push(arguments[i]);

}

return arr ;

}

  </script>

如果没有提供参数,那么它的类型为undefined.

function displayerror(msg){

if(typeof msg == 'undefined') // 如果没有提供参数

msg = "defined msg!! ";

alert(msg);

}

displayerror(); 

displayerror("custom msg!!");

Typeof 语句与类型检查

使用Typeof 来判断对象类型的例子

// 检查我们的数字是否实际上是字符串

if (typeof num == "string")

num = parseInt(num) ; // 如果是则根据这个字符串解析出整数来

// 检查我们的数组是否实际上是字符串

if (typeof array== "string")

num = arr.split(",") ;  // 如果是则根据逗号解析出数组来

第二种检查数据类型的方法,需要引用所有JavaScript对象都带有的一个属性,称为构造函数(constuctor)。这一属性引用的是原本用来构造该对象的那个函数。

if (num.constuctor == String)

num = parseInt( num ) ;

if(str.constuctor == Array)

str = str.join(',') ;

下面展示了用两种方法对不同类型对象进行类型检查的结果:

变量                                typeof                                    constuctor

{an: "object"]                 object                           Object

{"an", "array" }               object                            Array

function() {}                   function                       Function

"a string"                       string                            String

55                                  number                         Number

True                               boolean                        Boolean

new User()                     object                           User

 

// 用一个变量类型列表严格检查一个参数列表

function strict(types , args){

// 保证类型的数量和参数的数量相匹配

if(types.length != agrs.length){

// 如果不匹配则抛出一个异常

throw "invalid number of arguments. Expected " + types.length + 

  " , received " + args.length + " instead. " ;

}

// 遍历所有参数检查它们的类型

for(var i=0; i<args.length; i++){

if(args[i].constuctor != types[i]){

throw "invalid arguments type. Expected " + types[i].name + 

  " , received " + args[i].constuctor.name + " instead. " ;

}

}

}

function userList(prefix , num , users) { 

// 保证 prefix 是字符串, num 是数字, user是数组

strict([String , Number, Array] , arguments);

for(var i=0; i<num; i++)

print(prefix + " : " + users[i]);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值