1.函数
     函数就是将具有一定功能的一段JS代码的封装,可以在程序的多个地方被反复调用。
     1)定义函数
         格式一:
             function 函数名([形参列表]){
                 函数体;
                 [return [<表达式>];]
             }
         格式二:
             var 变量名 = function([形参列表]){
                 函数体;
                 [return [<表达式>];]
             }
         格式三:
             ;(function([形参列表]){
                 函数体;
                 [return [<表达式>];]
             })([实参列表]);
             上面的函数叫立即执行函数表达式(IIFE),它会自动调用自身,不被在其它地方被调用,一般用于JS库或JS插件的封装或闭包处理。
     2)函数调用
         函数名([实参列表]);        Tips:
             函数不会自动执行(IIFE(立即执行函数表达式)除外),必须通过调用才能执行。
     3)return
         函数可以通过return返回结果,如果return没有返回结果,表示结束函数的调用,且返回调用处。
     4)arguments对象
         返回实参列表的一个伪数组。
         一般用在不确定传过来的实参的个数的情况下。
 2.对象(object)
     对象,其实就是一种类型,即引用类型。用于将数据和功能组织在一起。
     对象由属性和方法组成,通常用键值对定义。
     1)对象定义
         a)new构建
             new Object([参数]);
         b)字面量定义
             var obj = {
                 key: value,// 属性
                 fn: function(){ // 方法
                     ...
                 }
             }
     2)对象的引用
         a)对象名.属性名
           对象名.方法名([实参列表])
         b)对象名[属性名]
 3.数组(Array)
     数组将一组数据组合到一起,并存入到一个变量中,数组是有序排列的,占用一段连续的内存空间。
     一个数组可以存储不同类型的数据。
     1)定义数组
         a.new
             new Array([值列表])
         b.字面量创建
             var arr = [值列表]
     2)获取数组元素值
         数组名[下标] // 下标可以是一个数值型常量,也可以是一个表达式或函数或变量
     3)遍历数组
         一维数组用一个循环实现;二维数组必须用双重循环实现(先行后列)。
         a.for
         b.for...in      // 推荐写法
         c.forEach()
     4)数组的属性和方法
         a.length属性
             获取数组的长度。
         b.方法
             i)push()
                 向数组中添加数组到数组最后。
             ii)pop()
                 删除数组最后一个元素。
             iii)unshift()
                 向数组头部添加数据。
             iv)shift()
                 删除数组第一元素。
             v)concat()
                 将两个或多个数组组合成一个数组。
             vi)reverse()
                 对数组进行倒序处理。
             vii)join()
                 将数组转换为字符串。
             viii)splice()
                 删除、修改或向数组中添加数据。
 4.Function类型
     Function是一个用来构建函数的类(构造函数)。    函数内部属性
         在函数内部,有两个特殊的对象:arguments和this。
             callee:
                 arguments是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。
                 但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
                 也即是说可以通过arguments.callee调用函数自身,一般用于函数的递归调用。                函数自己调用自己叫函数的递归调用。
            this指针对象
                 在全局中this指向的是window(在JS中没有global这个全局对象,而JS的全局对象是window);
                 在函数中this指向的是这个函数执行所操作的当前对象。 
1.内置对象
     1)global对象
         在JS中没有global对象,Web浏览器将Global作为window对象的一部分加以实现。        方法:
             a.encodeURIComponent():对unicode进行编码处理
             b.decodeURIComponent():对unicode编码进行解码处理
             c.eval(''):具有字符串解析器的作用(慎用!因为它的性能较差,且比较危险)
     2)Math对象
         该对象主要提供了大量的数学运算的属性和方法。
         属性:
             Math.E
             Math.PI
         方法:
             Math.min():取最小值函数
             Math.max():取最大值函数
             Math.round():四舍五入函数
             Math.ceil():向上取整(取大于或等于操作数的最小整数)
             Math.floor():下下取整(取小于或等于操作数的最大整数)
             Math.random():产生[0,1)之间的一个任意小数
             Math.abs(num): 返回num的绝对值
             Math.exp(num): 返回Math.E的num次幂
             Math.log(num): 返回num的自然对数
             Math.pow(num,power): 返回num的power次幂
             Math.sqrt(num):返回num的平方根
             Math.acos(x): 返回x的反余弦值
             Math.asin(x): 返回x的反正弦值
             Math.atan(x): 返回x的反正切值
             Math.atan2(y,x): 返回y/x的反正切值
             Math.cos(x): 返回x的余弦值
             Math.sin(x): 返回x的正弦值
             Math.tan(x): 返回x的正切值
 2.面向对象
     创建对象:
         1)常规创建
             a.new
             b.字面量
         2)工厂模式
             通过封装函数实现创建一批相似的对象。
             缺陷:无法知道创建的对象是哪一个对象的实例。
         3)构造函数
             构造函数是用来构建一个类(ES5中没类的概念,实际上这里的构造函数就是类)。
             类是对象的一个抽象符号化表示(把相同或相似的一部分对象抽离出来就形成了一个类)。
             对象是类的实例化(具体化)(赋予一定的属性和功能)            a.创建构造函数(类)
                 语法:
                     function 类名([形参列表]){
                         this.属性名 = 参数;
                         ……
                         this.方法名 = function(){
                             函数体;
                         }
                         ……
                     }
             b.通过构造函数实例化对象
                 new 类名([实参列表]);            使用了构造函数的方法,和使用工厂模式的方法他们不同之处如下:
                 • 构造函数方法没有显式的创建对象(new Object());
                 • 直接将属性和方法赋值给this对象;
                 • 没有return语句。
             构造函数的方法有一些规范:
                 • 函数名和实例化构造名相同且大写,(PS:非强制,但这么写有助于区分构造函数和普通函数);
                 • 通过构造函数创建对象,必须使用new运算符。
            构造函数执行的过程:
                 • 当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object();
                 • 将构造函数的作用域给新对象,(即new Object()创建出的对象),而函数体内的this就代表new Object()
                 出来的对象。
                 • 执行构造函数内的代码;
                 • 返回新对象(后台直接返回)。
 3.基本包装类型
     在基本数据类型中有3个特殊的类的存在:String、Number和Boolean。
     上面三个基本类型都有自己的包装对象,有相应的属性和方法。调用方法的过程是在后台发生的,所以我们称作为基本包装类型。    通俗地讲就是基本类型的数据都有一个包装它们的类,这些类都有自己的属性和方法,这些基本类型的数据都可以直接去调用这些属性和方法。
    1)Boolean类型
         没有自己的属性和方法。
     2)Number类型
         a.属性
             MAX_VALUE 表示最大数
             MIN_VALUE 表示最小值
             NaN 非数值
             NEGATIVE_INFINITY 负无穷大,溢出返回该值
             POSITIVE_INFINITY 无穷大,溢出返回该值
             prototype 原型,用于增加新属性和方法
         b.方法
             toString() 将数值转化为字符串,并且可以转换进制
             toLocaleString() 根据本地数字格式转换为字符串
             toFixed() 将数字保留小数点后指定位数并转化为字符串
             toExponential() 将数字以指数形式表示,保留小数点后指定位数并转化为字符串
             toPrecision() 指数形式或点形式表述数,保留小数点后面指定位数并转化为字符串
             valueOf() 显示原始值
     3)String类型
         a.属性
             length
         b.方法
           str.charAt(n) 返回指定索引位置的字符
           str.charCodeAt(n) 以Unicode编码形式返回指定索引位置的字符
           str.concat(str1...str2) 将字符串参数串联到调用该方法的字符串
           str.slice(n,m) 返回字符串n到m之间位置的字符串
           str.substring(n,m) 返回字符串n到m之间位置的字符串
           str.substr(n,m) 返回字符串n开始的m个字符串
           str.indexOf(str, n) 从n开始搜索的第一个str,并将搜索的索引值返回
           str.lastIndexOf(str, n) 从n开始搜索的最后一个str,并将搜索的索引值返回
           str.str.toLowerCase() 将字符串全部转换为小写
           str.str.toUpperCase() 将字符串全部转换为大写
           str.match(pattern) 返回pattern 中的子串或null
           str.replace(pattern, replacement) 用replacement 替换pattern
           str.search(pattern) 返回字符串中pattern 开始位置
           str.split(pattern) 返回字符串按指定pattern 拆分的数组
           String.fromCharCode(ascii) 静态方法,输出Ascii码对应值
           str.localeCompare(str1,str2) 比较两个字符串,并返回相应的值
 4.变量、作用域及内存
     1)变量
         a.基本类型的变量
             基本类型的变量的值存储在栈中。通过变量名可以直接获取变量的值。
         b.引用类型的变量
             引用类型的变量的值存储在堆中,在栈中存储的是引用类型的变量的地址(指针)。
             如果要获取引用类型变量的值,需要先从栈中获取地址,再按址查找,从而获取到值。
     2)作用域
         在ES5作用域分为全局作用域和局部作用域两种。
         在ES6作用域分为全局作用域、局部作用域和块级作用域三种。
             全局作用域:
                 定义在函数外部的变量拥有全局作用域。
             局部作用域:
                 定义在函数内部的变量拥有局部作用域。
     3)垃圾回收机制
         JS有自动回收垃圾的功能。
         在项目开发过程中,初始化对象时,最好赋初值为null。