JavaScript高级程序设计(红宝书)

前言

2019年6月17日21:57:34

  • 本笔记只做概念提要,不做大而全,只做小而精

1. JavaScript简介

  • JavaScript:ECMAScript、DOM、BOM
  • 宿主环境:Web浏览器、Node(服务端JavaScript平台)
  • BOM:弹出新窗口、移动缩放、navigator、location、screen、cookies、XMLHttpRequest

2. 在HTML中使用JavaScript

  • script(阻塞DOM渲染)、async(加载完就执行)、defer(所有DOM渲染完毕执行)
  • HTML Parser & Scripting
  • 文档模式doctype (IE5.5)
    • 混杂模式quirks mode
    • 标准模式standards mode
    • 标准准模式almost standards mode
      • 过渡型transitional
      • 框架集型frameset
    • 混杂与标准的区别:主要影响CSS
      • 盒模型(width 包不包含 padding)
      • 表格和图片
      • 百分比宽高
      • 溢出
  • 在不支持的时候,平稳地退化

3. 基本概念

3.1 概述

  • 关键字keyword和保留字reserved
  • 省略var定义的变量会成为一个全局变量
  • typeof操作符
    • null和object —> “object”
    • function —> “function”
    • 正则表达式 —> “object”

3.2 基本类型

  • Boolean
    • 所有假值
      • number、string、boolean —> undefined
      • object —> null
      • number —> 0 和 NaN
      • string —> “”
      • boolean —> false
  • Undefined
    • undefined就是为了区分空对象指针和未经初始化的变量
  • Null
    • null是空对象指针
  • Number
    • 小数点后超过6位小数时会自动转换成指数表示法
    • NaN
      +(Not a Number)用以表示本来应当返回一个数字的操作数未返回数字
      • NaN不等于自身
      • isNaN会进行类型转换
    • 有三个函数可以把非数值转换成数字
      • Number(一元操作+一致)
        • Number(undefined) —> NaN
        • Number(null) —> 0
        • Number(string)
          • 只包含数字 —> 十进制数字
          • 有效的浮点格式 —> 对应浮点值
          • 有效的十六进制 —> 对应十进制
          • 空字符串 —> 0
          • 无效格式 —> NaN
        • Number(Object)
          • valueOf 依前所述规则转换,若NaN则toString
          • toString
      • parseInt
        • 忽略字符串前面的空格,直到找到第一个非空字符
        • -、+、number 解析所有字符直到遇到非数字
        • 经典应用:parseInt(‘250px;’) —> 250
        • 第二参数 指定要解析的字符串的进制
        • 始终将10作为第二个参数是十分必要的
        • 经典应用:考虑将各种进制转换成十进制
      • parseFloat
        • parseFloat 只解析十进制,没有第二参数
        • 可解析为整数的会返回整数,而不是浮点数
  • String
    • 转换成字符串
      • toString()
        • 第二参数,可以将十进制转换成其他有效进制
      • String()
        • 如果存在toString方法就调用
        • null —> null
        • undefined —> undefined
  • Object
    • Object每个实例都具有的属性和方法
      • constructor()
      • hasOwnProperty()
      • isPrototypeOf()
      • propertyIsEnumerable(propertyName) 属性是否可枚举(for-in)
      • toLocaleString()
      • toString() 返回对象的字符串表示
      • valueOf() 返回对象的字符串、数值、布尔值

3.3 操作符

  • 负数的二进制码
    • 绝对值的二进制
    • 反码
    • 反码 + 1
  • 逻辑非 !
    • Boolean() 和 !! 效果一致
  • 短路操作
  • 算术操作符
    • 数字优先
    • 出现非数字的简单类型,先调用Number()进行类型转换
    • 出现对象,调用其valueOf()再操作
  • + 字符连接符
    • 字符串优先
    • 两个操作数都是数字,加法,否则永远优先字符串
    • 一个操作数是字符串,则将另一操作数转换为字符串,拼接
    • 一个操作数是对象、数字、布尔,调用其toString方法,拼接
  • 关系操作符
    • <、>、<=、>=
    • 数字优先
    • 对象,valueOf
  • 总结: 优先考虑对象:
    • 遇到对象,就得先把对象转成简单类型
    • 转换成简单类型需要看操作符
      • 算术操作符、关系操作符
        • 遇到对象 —> valueOf成简单类型
        • 简单类型 —> Number成数字
      • 字符连接符
        • 遇到对象 —> toString成字符串
        • 简单类型 —> String成字符串
    • 都是简单类型时就看操作符,倾向于数字还是字符串
  • 全等和不全等
    • 区别:比较前是否强制类型转换
    • ==类型转换规则
      • 数字优先
      • 字符串 —> 数字
      • 对象 —> valueOf
      • 布尔 —> 数字
      • 双对象 —> 比较引用指向
  • 逗号操作符
    • 声明多个变量
      • var a = 1, b = 2, c = 3;
    • 一条语句执行多个操作,只返回最后一项
      • () => (console.log('any'),5)
  • 语句
    • do-while 后测试循环
    • while 前测试
    • for 前测试
      • for(initialization; expression; post-loop-expression)
      • 没有块级作用域 —> 循环外部可以访问i
    • for-in 枚举对象属性,没有顺序
  • 函数
    • 未指定return语句的函数返回的是一个默认的undefined
    • JavaScrip没有函数签名(接受的参数类型和数量)的概念,函数的参数在内部是由一个包含零个或多个值的数组实现的
    • arguments是类数组,不是真的数组
    • arguments和命名参数自动同步
    • arguments对象的长度是由传入的参数个数决定的,不是定义函数的形参个数
    • 没有重载
      • 声明两个相同名的函数,后者覆盖前者
      • 可以模拟重载

4. 变量、作用域和内存问题

  • 基本类型和引用类型
    • 基本类型 值 数据段
    • 引用类型 对象
  • 检测类型
    • typeof 区分基本类型
    • instanceof 输出具体的引用类型
  • 执行环境
    • execution context 执行环境定义了变量或函数有权访问的其他数据
    • 每个执行环境都有一个与之关联的变量对象variable object
    • 环境中定义的变量和函数都存储在变量对象中
    • 全局执行环境是最外围的执行环境,在浏览器中就是window
    • 某个执行环境中的所有代码执行完毕后,该环境被销毁,其中的变量和函数也随之销毁
  • 作用域
    • 当代码在一个环境中执行时,会创建变量对象的一个作用域链 scope chain
    • 作用域链保证对执行环境有权访问的所有变量和函数的有序访问
    • 全局执行环境的变量对象始终是作用域链中的最后一个对象
    • 延长作用域链 catch 临时增加变量对象
    • 沿作用域链向上搜索变量
  • 垃圾回收机制
    • 标记清除 mark-and-sweep
    • 引用计数 reference counting
      • 循环引用问题
    • 管理内存
      • 一旦数据不再有用,将其值设置为null来释放其引用 ———— 解除引用 dereferencing
      • 解除引用的真正目的是 让值脱离执行环境,以便垃圾回收机制下次运行时将其回收

下一篇: 第5章(引用类型)