订阅 订阅  :: 管理

Javascript 学习笔记之一

Posted on 2010-05-05 09:24  hfCoder  阅读(152)  评论(0)    收藏  举报

  从今天开始,我将“不务正业”的学习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] + “类型”;
}
}
}