JavaScript红宝书读书笔记

243 阅读6分钟

第二章 在HTML中使用javaScript

  • <script></script> 建议集中放在body标签的底部,提高页面的加载速度
  • <script></script> 可以引用本地以及制定url的js文件
  • <script></script>def将js脚本的解析顺序放在</html>之后。仅适用于引用url脚本
  • <script></script>asyn将异步下载js脚本、而不是同步下载。仅适用于引用url脚本

第三章 基本概念

  • js使用与java一致的驼峰命名规则
  • 每条语句单列,强烈建议使用 ;号分割语句
  • js内的变量是弱类型的
    1. var a;//声明一个变量,未初始化。a此时为undefined。undefined是js中内置的一个常量和null类似
    2. var a = “hello js”//申明一个变量,并且拥有初始化
    3. 强烈建议任何变量的赋值和生命都带var关键字。避免 a = “hello word"这样的声明方式
  • typeof是内置操作符,可以获取变量的类型:
    1. typeof a;
    2. typeof("hi js");
  • js中类型:
    1. Null类型:null取值。 Undefined类型:undefined取值。Boolean类型:true和false两种取值。这些都是js内的常量
    2. Number类型:整型(二进制、十进制、八进制、十六进制)、浮点型
    3. 字符串转换成数据类型:Number("3.13");parseInt("1");parseFloat("1.2");
    4. 值/数值转换成字符串:a.toString();或者string(a);
    5. Object类型: var a = new Object();(建议) var b = new Object;(不建议)
  • 操作符:绝大多数操作符合java、c等主流语言类似。仅关注=== 与 ==即可。
    1. === 绝对相等操作符。类型和值都需相等。比如"1" == 1 不成立。
    2. ==近似相等。通过隐式类型转换后相等即可。比如"1" == 1 成立。
    3. !== 非全等。比如"1" = 1 成立。
    4. != 完全不等。比如"1" = 1 不成立。
  • 控制语句:
    1. if; do while; while; for;switch;break;continue等语句和java、c相同。
    2. 增加了枚举对象属性的for in语句。 for(var pro in object){console.log(pro);}
  • 函数:
    1. function关键字生命函数
    2. 函数生命无须添加返回值
    3. js的函数申明了php很像
    4. 强烈建议在函数形参方面不适用js arguements特性。忘掉这段特性
    5. js没有语言级别的函数重载
    6. js允许函数嵌套定义。

第四章 变量、作用域和内存问题

  • js将变量类型分为值类型和引用类型
    1. 值类型: Number、Undefined、Boolean、Null、String。java中String是引用类型
    2. 引用类型:对象。
  • typeof操作符用来区分基本类型。instanceof用来区分对象是哪种类的实现。
  • 作用域链:js解析变量的顺序是从作用域链前端开始搜索、一直搜索到作用域链的后端。作用域链的最前端是当前函数栈、作用链的末端是全局环境栈。
  • js不存在块级作用域。java、c、php都有块级作用域。
  • js的垃圾收集: 引用计数和标记清除。

第五章:引用类型

  • js并非完全面向对象的、其不支持接口的概念。
  • 创建对象的方式有两种:
    1. var o = new Object();//常规方式创建
    2. var o ={name:"hi",age:9};//字面量方式创建。通过字面量创建对象,并不会调用构造方法
  • 通过object.pro的方式访问对象中的方法和属性。
  • js内置Array类型
    1. var array = new Array();//常规
    2. var array = [1,2,3,4];//字面量
    3. Array类型是动态数组
    4. push()方法像数组末尾添加元素
    5. pop()删除数组末尾元素
    6. shift()删除数组首端元素
    7. unshift()想数组手端添加元素
    8. 通过push、pop、shift、unshift能够使Array具备栈和队列的能力。
    9. reverse()翻转
    10. sort()排序
    11. sort(funtion(arg1, arg2){});定制排序规则
    12. 更多Array操作随用及查
  • js的Function类型
    1. Function类型就是js中的类、等同于其他面向对象中的Class。每个函数都是Function的实力;(每个对象都是Class的实例子)
    2. 函数名称是指向函数对象的指针。(建议不要用到该属性)
    3. 函数声明具备“函数声明提升”的效果;函数表达式不具备“函数申明提升的效果”。
    4. 函数声明提升:js解释器会将函数生命提升到顶部。尽管你在文件的末尾定义的函数,也能在任何位置使用该函数。
    5. Function内部有两个非常特殊的属性:constructorprototype
  • js的Number、Boolean、String都有与其对应包装引用类型。这些基本类型->包装引用类型的转变是解释器自动完成的。相当于语法糖。
  • Global 和Math对象的相关API、随用随查。

第六章 面向对象程序设计

  • js提供两类对象:
    1. 原生引用类型,比如Array、Date、Global、Object等
    2. 自定义引用类型。
  • js提供两种方法创建自定义引用类型
    1. new Object()方法
    2. 字面量定义对象。该种方法不会触发构造函数调用
  • js的面向对象可以看成数一组无顺序属性的集合(属性名:属性值)。属性值可以是基本类型、引用类型、函数。js对象的概念和散列表非常相似。
  • js内部并没有提供class的关键字。js是通过直接定义类的构造函数来定义对象类型的。
//定义对象的构造函数、首字母需要大写
 function Person(name, age, address){
     this.name = name;    //定义对象属性
     this.age = age;
     this.address = address;
     this.sayName = function(){ //定义对象方法
         return "hello" + this.name;
     
 }
 //创建对象
 var person = new Person("tu",18,"bupt");
  • prototype的概念
  1. 所有Function中都存在一个prototype属性。
  2. prototype属性是一个指向对象的指针。指向的对象成为原型对象。由相同构造方法创建的所有实例子共享同一个原型对象。
  3. js提供原型的概念用以抽象出相同类、不同实例之间的共有的属性和方法。如下图所示,person1对象和person2对象共享相同的属性和方法。
  4. prototype作用基本等价于其他oop中类成员变量类成员函数的概念
    图1

图2
在上图中,如果访问person1的name属性,一般会经过两次搜索过程。第一次是在其实际例子中搜索name属性,如果找到则返回。如果没找到,则进入原型对象中搜索,如果找到则返回。如果实例和对象中都不存在该属性,那么返回undefined。

  1. js中定义引用类型的默认模式:构造函数中定义属性值;原型中定义公共方法

经典定义引用类型的模式
6. 通过原型链实现的继承关系:

子类的原型是父类的实例

第七章 函数表达式

  • js支持两种方式创建函数:

    1. 函数声明方式
    hello("hello","world"); // 函数声明自带函数声明提升功能
    function hello(arg1, arg2){
        console.log("函数声明方式");
    }
    
    1. 匿名函数:匿名函数的this对象指向window
    var hello = function(arg1,arg2){
        console.log("匿名函数形式")
    }
    hello("hello","word");//匿名函数不具备函数提升功能
    
  • 闭包:某函数能访问另外一个函数作用域中的对象成为闭包

     function wrapper(arg1, arg2){
        return funtion(arg3, arg4){
            var sum = arg1 + arg2; //该函数内部,访问了wrapper函数的arg1和arg2参数
            return sum/(arg3+arg4);
        }
     }
    

    理解闭包,其实就是开解函数作用域链的过程内部函数持有外部函数的作用域

    1. 进一步理解闭包
      进一步理解闭包
      result中的每个函数都返回10。因为result[i]这个匿名函数的作用域链中持有的是引用
    2. 符合预期的闭包
      符合预期的代码
    3. 闭包产生内存泄漏的风险:

4. 匿名函数模仿块级作用域