从今天开始,我将“不务正业”的学习javascript,虽然用了小一年的js现成代码了,也多多少少写了几行js。但是却没有认真的从头到尾学过javascript。最近一段时间发现学习目标很不明显,动力也有问题,想起longshanks曾经教育我说随便找件自己感兴趣的做着,故此打算借javascript开始我的博客之路。至于能否坚持我暂时不敢确定,不过我会尽力滴。
最近翻了几本js方面比较热的书,《javascript权威指南》,《精通javascript》,《javascript高级程序设计》,《javascript语言精粹》,《javascript语言精髓与编程实践》,《learning javascript》。由于是在书店翻阅的,几本就仔细对比了下目录,和部分文字。因此也不敢妄加评论,但是由于自己要完整的学习一门语言,因此也就挑选了几本作为学习材料。故在这里说上一二。
《javascript权威指南》,犀牛书的名声在外我不必多言,是一本值得作为参考书的好材料,另外虽然前面几章说的略为简单浅显,但是其本质内容都说到了,完全可以作为入门书大致翻一遍,而以后放在书架上作为参考书一点也不浪费这百来元钱。《精通javascript》一书看上去要高级的多,整体翻下来很像是jQuery的剖析,只是中文版的翻译错误较多,迫不得已,让我这个英文盲只好选了本英文版的以备不时之需吧。《learning javascript》书中内容与其中文版的书名有点差距较大,看了下目录,决定暂时还是没有入手。《javascript语言精粹》与《javascript高级程序设计》这2本书的中文翻译过得去,但不能称得上完美,原书据说很好,但是无奈英文水平摆在这里,就不敢妄自评价,只好把书推荐给公司,看公司是否愿意购买。最后说说周爱民老师的《javascript语言精髓和编程实践》与我购买的英文版的《Pro javascript Techniques》有异曲同工之妙,由于该书不存在翻译一说,故此就毫不犹豫的拿下了,当然也有对那本英文书胆怯不自信的体现在里面。
Javascript的重载
函数的重载往往是通过对参数的数量和参数类型来区分的。在javascript中可以使用以下方式来进行函数的重载。其实在js中,我们的重载函数其实是通过分支来实现的,而非2个重名的函数。所以我们所做的一切也都是模拟重载而已。
1、arguments.length.通过数量的方式来实现函数的重载。
function Test(val, name) {
if(arguments.length == 1) {
alert(val);
}
else if(arguments.length == 2) {
alert(name + “ said “ + val);
}
else {
throw “Error”;
} }
在函数中arguments是一个内置对象。他是表示调用函数的参数数量的一个类数组,他是一个只读属性。
2、typeof类型判断
function Test(name,age,sex) {
if(typeof name == “string”) {
//
}
}
3、constructor进行类型判断
functionTest(name,age,sex) {
if(name.contructor == String) {
//
}
}
对于2和3两种类型判断有个差别在于typeof方法当变量是个非内置类型时,也就是用户自定义的对象时通常返回的都是object,此时就无法区分了。比如var p = new Person();那么typeof p == “object”而p.contructor ==Person.所以从这个角度来看使用constructor来进行类型判断要优于typeof。
同时我们也能看到,进行重载函数模拟往往带来另外一个负面影响,就是函数体内代码必然会有所增长,所以在进行这种做法的时候首先要考虑必要性。
除了用作重载模拟,contructor的重要作用当然在对参数的合法性进行判断了。
function Person(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
这种写法是没有语法和逻辑的错误的,但是考虑到参数的安全性和合理性来说,我们有必要加上一个判断
function Person(name,age,sex) {
if(arguments.length != 3) {
throw “Wrong number”;
}
if(name.constructor != String && age.constructor != Number&& sex.constructor != Boolean) {
throw “Wrong type”;
}
}
到此,类型检查已经做完了,可以保证其基本的合理性了,然而对我来讲,不习惯把这种事每次都写在函数体内,于是就想能够想办法提取出一个单独的函数出来,所幸pro javascript tech给出了一个参考。
function strict(types,args) {
if(types.length != args.length) {
throw “参数个数不正确”;
}
for (var I = 0; I < types.length; i++) {
if(args[i].constructor !=types[i]) {
throw args[i] + “ 不是 ” + types[i] + “类型”;
}
}
}
浙公网安备 33010602011771号