1. ***日期API

2. ***Error


1. ***日期API

   单位:  FullYear   Month     Date          Day

             Hours      Minutes   Seconds    Milliseconds

   API: 1. 每个单位都有一个对儿get/set方法

            比如: var year=date.getFullYear()//获取单位的值     

                     date.setFullYear(year)//设置单位的值

            特殊: Day没有set方法

          2. 命名: 年月日星期没有s结尾

                      时分秒毫秒都有s结尾

          3. 取值范围: 只有Date从1~31

                   不考虑FullYear, 其余都是从0开始,到进制-1结束

               Month: 0~11 总比现实中小1, 需要修正

               Date: 1~31   不用修正

               Day: 0~6      不用修正

               Hours: 0~23 不用修正

               Minutes/Seconds: 0~59 不用修正 

   日期计算: 

      1. 计算两个日期的时间差: 两日期相减,得毫秒数,再换算

      2. 对任意单位做加减: 3步: 

           1. 取分量: var d=date.getDate();

           2. 做加减: d+=60

           3. 放回去: date.setDate(d);

                强调: 所有set方法可自动调整时间进制

          其实可简写为: date.setDate(date.getDate()+60)

   转字符串: 

       date.toString() -> 当地时间的完整时间格式

       date.toLocaleString() ->当地时间的简化版格式

       date.toLocaleDateString() -> 当地时间的日期部分

       date.toLocaleTimeString() -> 当地时间的时间部分

       date.toGMTString() -> 标准时区的标准时间


   作业: 自定义format函数: 2_format.html


2. ***Error

   什么是错误(bug): 程序执行过程中遇到的异常中断。

          一旦发生错误,程序立刻退出。

   什么是错误处理: 即使程序发生错误,也能保证程序不异常中断的一种机制。

   如何: 

       try{

           可能发生错误的代码

       }catch(err){//仅在发生错误时,才执行

           错误处理代码: 1. 提示用户错误信息(String(err))

                                  2. 记录系统日志

       }finally{

           无论是否发生错误,都必须执行的代码。

           比如: 释放资源!

       }

  err: Error对象: 在错误发生时,自动创建的,保存错误信息的对象。

    错误类型6种: 

        SyntaxError   语法错误

        ReferenceError   要使用的变量没找到

        TypeError   错误的调用了对象的方法

        RangeError  参数范围越界 比如: toFixed(d) 0~20


        EvalError   URIError

1. ***错误处理

2. ***Function

   *****闭包


1. ***错误处理

    只要可以提前预料的错误,都要用if...else...来代替try catch

    只有无法提前预料的错误,采用try catch


    主动抛出错误: 

    为什么: 抛出错误通常是为了提醒使用者错误的使用的程序

    如何: throw new Error("错误消息")


2. ***Function:

    什么是: js中一切函数都是对象

                函数对象是专门封装函数定义的对象。

    创建: 3种: 

      1. 声明: function 函数名(参数列表){函数体; return 返回值;}

          何时: 只要一段代码被反复使用,都要先定义在一个专门的函数中,再反复调用函数即可——复用

             何时使用参数: 只要函数步骤中必须某些数据才能正常执行时,就要定义参数。

             何时使用返回值: 如果函数的调用者需要函数的执行结果时,函数就必须返回值。

         可被声明提前: 

      2. 函数直接量: 

       var  函数名=function(参数列表){函数体; return 返回值;};

         不会被声明提前。

****声明提前(hoist): 在开始执行程序前,将所有var声明的变量和function声明的函数提前到*当前作用域*的顶部,集中创建。

          赋值留在原地!

       何时: 只要不希望被声明提前时。

        揭示了: 函数名仅是一个普通的变量

                    函数定义其实是一个对象

                    函数名中仅保存了函数对象的地址——引用


      3. 用new: 

var fun=

     new Function("参数1","参数2",...,"函数体; return 返回值")


     比如: function compare(a,b){return a-b;}

              var compare=function(a,b){return a-b;}

              var compare=new Function("a","b","return a-b;");


***重载(overload): 

  什么是: 相同函数名,不同参数列表的多个函数,在调用时,可根据传入参数的不同,自动选择对应的函数调用!

   为什么: 减轻调用者的负担,一个函数名,可执行多种操作

   何时: 一项任务,根据不同的参数,执行不同的操作流程时

   如何:   js语法不支持重载效果

      变通:  所有函数对象内,都自动内建了一个arguments对象

         arguments对象: 

            专门保存传入函数的所有参数值的类数组对象

             类数组对象: (object like array)

                vs 数组: 相同: 下标, length, for遍历

                             不同: 类数组对象是Object,不是Array,无法使用Array的API

                                     数组是Array类型,可以使用数组类型所有的API


    匿名函数: 

    什么是: 函数创建时,不被任何变量引用的函数

    为什么: 节约内存

    何时: 如果一个函数只用一次,用完希望自动释放时

        1. 回调callback: 将函数作为参数传递给另一个函数去调用  

            比如: arr.sort(function (a,b){return a-b});

                     str.replace(/reg/g,function(kw,$1,...){return ...})

        2. 自调: 创建函数后立刻调用自己!

            何时: 如果一个函数只执行一次,不会再重用时

            为什么: 建立临时作用域!避免全局污染!

            如何: 

               (function(参数列表){函数体; return 返回值})();