zoukankan      html  css  js  c++  java
  • 《JavaScript高级程序设计》读书笔记 14章

    第一章:JavaScript是什么
     

    1.起源:做一些输入有效性的验证,减轻浏览器负担

    2.ECMAScript:JavaScript实现的基础,是标准,但不是javascript唯一的部分。
    3.javascript组成:核心(ECMAScript),DOM(doucument object model),BOM(brower object model)
    4.ECMAScript:ECMAScript仅仅是一个描述,定义了脚本语言的所有属性,方法和对象。其他语言可以实现ECMAScript来作为功能的基准,如JavaScript
    5.DOM:DOM是HTML和XML的应用程序接口(API)。通过创建树来表示文档。DOM其实不是javascript专有的,只是浏览器内部已经通过ESMAScript实现了DOM,成为了javascript的重要组成部分
    6.BOM:可以对浏览器窗口进行访问和操作。
     
    第二章:ESMAScript基础

    1.语法
        区分大小写,变量都是弱类型(var),建议每行结尾有分号。//单行注释  多行注释。括号标明代码块
    2.变量
    3.关键字
    4.ECMAScript原始类型: Null  Undefine  string  Boolean Number
    5.typeof运算符  
       undefined    undefined 类型
       boolean      boolean类型
       number      number类型
       string         string  类型
       object         如果变量是一种引用类型或null类型   现在认为null是对象对的占位符
    6.Undefined类型
       Undefined类型只有一个值,
       当声明的变量未赋值时,默认是undefined
       当函数无明确返回值时,返回值也是undefined
       typeof (temp) ==undefined   为true
    7.Null类型
       只有一个专用值null。值undefined实际上是从值null派生来的,因为ECMAScript认为他俩相等
       尽管这两个值相等,但含义不同。null用于表示尚未存在的对象。将变量设为null意味着允许回收
    8.Boolean类型
        非0即true
    9.Number类型
        直接输入的(而不是从另一个变量访问的)任何数字都被看做是Number类型
    10.string类型
    11.转换
        ① 转换成string
            boolean  string  number都有tostring()方法。值得一提的是,number的tostring()方法有两种方式,第一种是普通的,第二种是tostring(num),可以转换成num进制
        ②转换成number
            ParseInt()   ParseFloat()方法,若转换不成,则返回NaN
            ParseInt(‘1234ABC’)  将返回1234
        ③强制转换类型
               Boolean(value) 当转换的值至少有一个字符的字符串,非0数字或对象时,返回true
               Number(value) 转换传入的整个值,‘22.21.3’不能被转换,和ParseInt不一样
               String(value)  与tostring'()方法不同之处在于,强制转换null和undefined时不会报错
    12.引用类型
         对象是由new运算符加上要实例化的类的名字创建的
        var o=new object();//这段代码创建了object类的实例
    13.instanceof运算符
          类似typeof运算符,typeof运算返回对应的引用类型。instanceof返回boolean类型
          var s="asd";
          if(s instanceof string)
    14.运算符
             ①一元运算符
                 1.delete   删除开发者对以前定义的对象属性或方法的引用
                 2.void  该运算符对任何值都返回undefined。该运算符通常用于避免输出不应该输出的值。例如,从元素调用javascript时,函数不能有返回有效值,否则浏览器将清空页面,显示函数结果。最经典的使用就是
                 3.++  --
                 4.=+  =-
              ②位运算符
                  1.~   按位非
                  2.&   按位与
                  3.|    按位或
                  4.^    按位异或
                  5.<<  左位移符
                  6.>>  右移位符
              ③在加法中,如果计算字符串+数字,则数字转换成字符串,俩字符串拼接
                  在减法,乘法,除法中,均是字符串转换成数字做计算
                 在比较中,字符串转换成数字
               ④等号和非等号
                  为确定两个运算数是否相等,这两个运算符都会进行类型转换
                  1.boolean类型先转换为数字  
                  2.若运算符一个是字符串,一个是数字,则字符串通过强制转换为数字。如('1234abc'==1234)返回false
                  3.若一个运算数是字符串,另一个是对象,调用对象tostring()方法
                  4.null值与undefined相等
                  5.NaN!=NaN
                  6.若两个运算数都是对象,则比较两个运算数的引用值
    《JavaScript高级程序设计》读书笔记 <wbr> <wbr>1-4章
    15.函数
         1.函数不用专门声明返回值。不管拥有有返回值
         2.函数不能重载,如果在同一作用域中定义两个名字相同的函数,则实际调用的是后一个
             使用arguments避免这种情况
         3.ECMAScript最令人感兴趣的是函数实际上是一个功能完整的对象
              用function类直接创建方法:
             var fun=new function(args1,agrs2.....functionbody);
             函数类也有toString()方法,返回函数体
         4.函数闭包
             简而言之,就是可以访问函数外定义的变量
             简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量
             闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例
             闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
    第三章 对象基础
          1.ECMAScript有无用存储单元收集程序,意味着不比专门销毁对象来释放内存
          2.当再没有对对象的引用时,称该对象被废除了。
          3.每当函数执行完,无用存储单元收集程序变会运行。当然,还有一些不可预知的情况下,该程序也会运行
          4.将对象的所有引用设置为null,可以强制性的废除对象
         《JavaScript高级程序设计》读书笔记 <wbr> <wbr>1-4章
          5.早绑定与晚绑定
               所谓绑定,是把对象的接口(我理解为定义)与对象实例结合在一起的方法 
               早绑定,是指在实例化对象之前定义它的特性和方法,java,VB中就是这样
               晚绑定,是指在编译器或解释程序在运行前,不知道对象的类型
          6.本地对象
               《JavaScript高级程序设计》读书笔记 <wbr> <wbr>1-4章
           7.Array类
                   var aValues=new Array();
                   var aValues=new Array(20);
                   var aValues=new Array("a","b","c");
                   var aValues=["a","b","c"];
     
                   aValues[0]="a";
                   aValues[1]="b"
                   长度可以动态增长
     
                   aValues.toString()和aValues.valueOf()均返回数组中的值
                   aValues.join(char)   类似C# string.join
                    
                   数组提供操作最后一项的push()  和  pop()   两个方法
                                      第一项的方法   shift() 和unshift() 方法
     
              《JavaScript高级程序设计》读书笔记 <wbr> <wbr>1-4章
           8.内置对象
             1.由ECMAScript实现提供的,独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。即不必明确实例化内置对象,它已经被实例化了
             2.ECMAScript中不存在独立的函数,所有函数必须是某个对象的方法。
                   isNaN(),isFinite(),parseInt(),parseFloat()均为Global对象的方法
                   encodeURI()和encodeURIComponent()方法用于编码传递给浏览器的URI
                   encodeURI()用于处理完整的URI,不对特殊符号编码
                   encodeURIComponent()用于处理片段,对所有特殊符号编码
                   decodeURI(),decodeURIComponent()
             3.eval_r()  号称最为强大的方法,就像整个ECMAScript的解释程序,接受一个参数。在运行时,将参数解释为真正的语句,然后插入该函数所在的位置
                eval_r()在处理用户传递输入的数据时,容易造成代码注入
             4.另一个内置对象是Math
                   min()                                    pow()
                   max()                                    log()
                   abs()                                     sqrt()          random()   0-1   配合floor使用              
                   ceil()  向上舍入函数               acos()           tan()
                   floor()  向下舍入函数              asin()           sin()
                   round()   标准的舍入函数        atan()           cos()
          9.宿主对象
                   BOM  DOM
          10.作用域
                   1.公用,受保护和私有作用域
                        ECMAScript作用域只有一种公共作用域,所有对象的所有属性和方法都是公用的。
                        约定 _变量名   为私有成员
                   2.this关键字
                        this关键字总是指向调用该方法的对象
           11.定义类或对象
                   1.工厂方式
                        function createCar(){
                             var oTempCar=new object;
                             oTemoCar.color="color";
                             oTemoCar.doors=4;
                             oTemoCar.showColor=function(){
                                       alert(this.color);
                             }
                             return oTempCar
                        }
                        var car1=createCar();
                        var car2=createCar();
                        如此创建了两个car类,但会造成函数代码重复的弊端
                    2.构造函数方式
                        function Car(sColor,iDoors,iMpg){
                             this.color=sColor;
                             this.doors=iDoors;
                             this.mpg=iMpg;
                             this.showColor=function(){
                                  alert(this.color);
                             };
                        }
                         var oCar1=new Car("red",4,23);
                        var oCar2=new Car("blue",3,24);
                         如此创建了两个car类,但也会造成函数代码重复的弊端
                        注意:new运算符调用函数式,在执行第一行代码前先创建一个对象,只有this能访问这个对象,并且在函数结尾自动return
                    3.原型方式
                        function Car(){
                        }
                        Car.prototype.color="red";
                        Car.prototype.doors=4;
                        Car.prototype.showColor=function(){
                                    alert(this.color);
                        }
                        注意:在new Car()时,原型的所有索性都被立即赋予要创建的对象,意味着所有Car实例都是保存着指向showColor函数的指针
                     4.完美方案  混合的构造函数/原型方式
                        function Car(sColor,iDoors){
                                  this.sColor=sColor;
                                  this.iDoors=iDoors;
                        }
                        Car.prototype.sayHi=function(){
                                  alert(this.color)
                        }
                   5.实例
                        最常见的一个问题是字符串连接的性能。ECMASript的字符串长度不变,所以字符串连接非常耗资源
                        解决办法   Array.join();
                   6.修改方法
                        使用对象的prototype属性可以很容易的修改对象的方法,即使是内置对象也是如此
                        注意:使用时一定要用prototype.a=function(){}这种方式去添加新方法,如果是
                        prototype=function(){}  则会覆盖掉之前的函数
                        

    第四章  继承

                   1.继承机制的实现。
                        从基类入手,所有开发者定义的类都可作为基类。处于安全原因,本地类和宿主类不能作为基类,防止公用访问编译过的浏览器级代码,避免被用作恶意攻击。
                        子类将可以访问基类所有的属性和方法,也可以覆盖超类中的属性和方法
                   2.继承的方式 
                        1.经典的对象冒充方式
                    //混合构造函数\原型方法创建类方法
            function ClassA(name, age) {
                this.name = name;
                this.age = age;
                this.sayHi = function () {//注意,这里不能使用原型方法创造基类的函数
                    alert( "ClassA");
                }
            }
     
            function ClassB(name,age,color) {
                this.ClassA = ClassA;
                this.ClassA(name, age);
                delete this .ClassA; //因为是用在ClassA中时用this赋值,所以在ClassB中调用ClassA时,实际上时ClassB.name=name。然后删除ClassA
     
                this.color = color;
            }
            var testB = new ClassB("heh",18, "red");
            alert(testB.age);
            testB.sayHi();
              2.混合方式
            function ClassA(color) {
                this.color = color;
            }
            ClassA.prototype.sayHi = function () {
                alert( this.color);
            }
     
            function ClassB(name,color) {
                ClassA.call( this, color);
                this.name = name;
            }
            ClassB.prototype = new ClassA();
     
            var testB = new ClassB("color", "red");
            testB.sayHi();
                 3.call() 和 apply() 函数
              call()方法是最相似于对象冒充方法,它的第一个参数是用作this的对象,其他函数参数都直接传递给函数自身
          var a = "aa" ;
            var classA = function () {
                this.a = "red" ;
            }
            var testA = new classA();
            //alert(testA.a);
     
            function sayColor() {
                alert( this.a);
            }
            sayColor();
            sayColor.call(); //若call函数不传值,则不改变this
            sayColor.call(testA);
           由此,继承可以写成
          function ClassB(name,age,color) {
               // this .ClassA = ClassA;
                //this .ClassA(name, age);
                //delete this .ClassA; //因为是用在ClassA中时用this赋值,所以在ClassB中调用ClassA时,实际上时ClassB.name=name。然后删除ClassA
              ClassA.call(this,name,age);
     
                this .color = color;
            }
  • 相关阅读:
    优化Http请求、规则1减少Http请求 更新中
    js 验证日期格式
    SQL 在OPENQUERY中使用参数
    onpropertychange 和 onchange
    js 去掉空格
    检索 COM 类工厂中 CLSID 为 {000209FF00000000C000000000000046} 的组件时失败解决方法
    C#连接oracle数据库操作
    SQL游标
    MS SQL 设置大小写区别
    vs jquery 智能提示
  • 原文地址:https://www.cnblogs.com/qiuyeyaozhuai/p/2719096.html
Copyright © 2011-2022 走看看