JavaScript 高级语言程序设计:基本概念

第三章 基本概念

语法
  • 变量、函数名和操作符都区分大小写

  • 标识符

    • 即变量、函数、属性(包括函数的参数)的名字
    • 第一个字符必须是一个字母、下划线或美元符号
    • 其他字符可以是字母、下划线、美元符号或数字
    • 小驼峰格式
  • 严格模式

    • 为 JavaScript 定义了一种不同的解析与执行模型
    • 在严格模式下,ES3 中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误
    • 启用严格模式,添加代码:"use strict";
  • 语句

    • 推荐使用分号结尾(省略分号时,由解析器确定语句的结尾)
    • 推荐始终在控制语句中使用代码块,即使代码块中只有一条语句(防止压缩错误)
关键字和保留字
  • letyield 是 ES5 新增的保留字
变量
  • 松散类型:可以用来保存任何类型的数据

  • 可以在修改变量值的同时修改值的类型,但不推荐

  • 用 var 定义的变量将成为定义该变量的作用域中的局部变量,省略 var 操作符可以全局变量(但不利于维护,不推荐)

  • typeof 操作符

    • typeof(null) -> “object”
    • typeof(undefined) -> “undefined”
    • typeof(NaN) -> “number”
    • 对于未声明的变量,只能执行 typeof 操作符
  • Undefined 类型

    • 值为 undefined
    • n/a(或 N/A),not applicable,不适用
  • Null 类型

    • 值为 null
    • 表示空对象指针
    • null == undefined
    • 实际上,undefined 值派生自 null 值
  • Boolean 类型

    • 值为 true 和 false (区分大小写)
    • Boolean() 函数
      • Boolean("") -> false
      • Boolean(0) -> false
      • Boolean(NaN) -> false
      • Boolean(null) -> false
      • Boolean(n/a) -> true
      • Boolean(undefined) -> false
  • Number 类型

    • 浮点数值

      • var floatNum = .1 // 有效,但不推荐
      • 由于保存浮点数值需要的内存空间是保存整数值的两倍,因此 ECMAScript 会不失时机地将浮点数值转换为整数值
        • var floatNum = 1. // 解析为 1
        • var floatNum = 1.0 // 解析为 1
      • 可以用科学计数法表示
        • var floatNum = 3.125e7 // 等于 31250000
        • var floatNum = 3e-7 // 等于 0.0000003
      • 浮点数值计算会产生微小的误差,不要直接判断相等
    • 数值范围

      • Number.MIN_VALUE = 5e-324
      • Number.MAX_VALUE = 1.7976931348623157e+308
      • 超出 JavaScript 数值范围的值会被表示成 Infinity
      • isFinite() 函数判断是否在数值范围内
    • NaN

      • 非数值,用于表示一个本来要返回数值的操作数未返回数值的情况(如除 0)
        • 0 除以 0 返回 NaN
        • 正数除以 0 返回 Infinity
        • 负数除以 0 返回 -Infinity
      • NaN 与任何值都不相等,包括 NaN 本身
        • NaN == NaN // false
      • isNaN() 函数判断是否非数值
        • isNaN(NaN) // true
        • isNaN(10) // false(10 是一个数值)
        • isNaN(“10”) //false(可以被转换成数值 10)
        • isNaN(“blue”) // true(不能转换成数值)
        • isNaN(true) // false(可以被转换成数值 1)
    • 数值转换

      • Number(),可用于任何类型
        • Number(null) -> 0
        • Number(undefined) -> NaN
        • Number("") -> 0
        • Number(“Hello”) -> NaN
      • parseInt(),用于字符串类型
        • parseInt(string, radix) // 待转换的字符串,基数(即多少进制)
        • 遇到第一个非数字字符时终止(包括小数点)
        • parseInt("") -> NaN
        • parseInt(“123blue”) -> 123
      • parseFloat(),用于字符串类型
        • 解析到遇见一个无效的浮点数字字符为止(第二个小数点无效)
        • 始终忽略前导 0
        • 只解析十进制
  • String 类型

    • 字符字面量,即转义字符
    • 字符串的特点
      • 不可变,需要销毁原字符串,再用包含新值的字符串填充
    • 转换为字符串
      • toString() 方法
        • 可以传递一个参数:输出数值的基数
        var num = 10;
        num.toString(16);  // "a"
        var bool = true;
        bool.toString();  // "true"
        
        • null 和 undefined 没有这个方法
      • String() 转型函数
        • 如果要转换的值有 toString() 方法则调用该方法
        • String(null) -> “null”
        • String(undefined) -> “undefined”
  • Object 类型

    • 创建对象 var o = new Object()
    • 基本属性和方法
      • constructor: 构造函数
      • hasOwnProperty(propertyName): 是否含有某个属性
      • isPrototypeOf(object): 用于检查传入的对象是否是传入对象的原型
      • propertyIsEnumerable(propertyName): 用于检查给定的属性是否能够使用 for-in 语句来枚举
      • toLocaleString(): 返回对象的字符串表示
      • toString(): 返回对象的字符串表示
      • valueOf(): 返回对象的字符串、数值或布尔值表示,通常与 toString()方法的返回值相同
操作符
  • 一元操作符

    • 递增和递减操作符(--++)
      • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作
      • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN
      • 布尔值变量先转为数值变量,再执行加减 1 操作
      • 浮点数值可以直接执行加减 1 的操作
      • 在应用于对象时,先调用对象的 valueOf()方法以取得一个可供操作的值。若结果是 NaN,则再调用 toString() 方法。然后再执行上述规则。
    • 一元加和减操作符(-+)
      • 应用于非数值时,会像 Number() 一样先对值进行转换
      • 若是减操作符,则将转换后的值转为负数
  • 位操作符

    • 按位非(~)
      • 返回数值的反码
    • 按位与(&)
    • 按位或(|)
    • 按位异或(^)
    • 左移(<<)
    • 有符号的右移(>>)
      • 绝对值右移,保留符号位(即正负符号)
    • 无符号的右移(>>>)
      • 会将数值的所有 32 位都向右移动
      • 无符号右移操作符会把负数的二进制码当成正数的二进制码(负数以其绝对
        值的二进制补码形式表示)
  • 布尔操作符

    • 逻辑非(!)
      • 会先对操作值执行 Boolean() 转换,再对该布尔值取反
    • 逻辑与(&&)
      • 属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值
      • 如果第一个操作数为对象,则返回第二个操作数
      • 如果第一个操作数返回 true,第二个操作数为对象,则返回该对象
      • 如果有一个操作数为 null / NaN / undefined,则返回 null / NaN/ undefined
    • 逻辑或(||)
      • 也是短路操作
      • 如果第一个操作数是对象,则返回第一个操作数
      • 如果第一个操作数的求值结果为 false,则返回第二个操作数
  • 乘性操作符

    • 乘法(*)
      • NaN * 任意 -> NaN
      • Infinity * 0 -> NaN
      • Infinity * 非零 -> Infinity / -Infinity
    • 除法(/)
      • NaN / 任意(或 任意 / NaN) -> NaN
      • Infinity / Infinity -> NaN
      • 0 / 0 -> NaN
      • 非零 / 0 -> Infinity / -Infinity
      • Infinity / 非零 -> Infinity / -Infinity
    • 取模(%)
      • Infinity % Infinity -> NaN
      • 有限大数x % 0 -> NaN
      • 有限大数x % 无穷大数y -> x
      • 无穷大数x % 有限大数y -> NaN
      • 任意 % 0 -> 0
  • 加性操作符

    • 加法(+)
      • NaN + 任意数值 -> NaN
      • Infinity + (-Infinity) -> NaN
      • (+0) + (-0) -> +0
      • 非数值时,得到字符串拼接的值
    • 减法(-)
      • NaN - 任意值 -> NaN
      • 非数值时,先转化为数值在进行计算
  • 关系操作符

    • 小于(<)、大于(>)、小于等于(<=)、大于等于(>=
    • 都返回 Boolean 值
    • 两字符串比较 ascii 码
    • 其中一个是数值,将另一个转为数值比较
    • 其中一个是对象,则调用 valueOf(),没有则调用 toString(),再比较
    • 布尔值先转为数值再比较
  • 相等操作符

    • 相等(==)和不相等(!=)
      • null == undefined -> true
      • “NaN” == NaN -> false
      • 5 == NaN -> false
      • NaN == NaN -> false
      • NaN != NaN -> true
      • false == 0 -> true
      • true == 1 -> true
      • true == 2 -> false
      • undefined == 0 -> false
      • null == 0 -> false
      • “5”== 5 -> true
    • 全等(===)和不全等(!==)
  • 条件操作符(a ? b : c)

  • 赋值操作符

    • 乘/赋值(*=
    • 除/赋值(/=
    • 模/赋值(%=
    • 加/赋值(+=
    • 减/赋值(-=
    • 左移/赋值(<<=
    • 有符号右移/赋值(>>=
    • 无符号右移/赋值(>>>=
  • 逗号操作符

    • 使用逗号操作符可以在一条语句中执行多个操作
语句
  • if 语句

  • do-while 语句

  • while 语句

  • for 语句

  • for-in 语句

    • 可以用来枚举对象的属性
  • label 语句

    • 使用 label 语句可以在代码中添加标签,以便将来使用
  • break 和 continue 语句

    • 在多重循环时,与 label 结合使用,可以直接退出外部循环
    outermost:  // label
    for (var i=0; i < 10; i++) {
        for (var j=0; j < 10; j++) {
            if (i == 5 && j == 5) {
                break outermost;
            }
            num++;
        }
    }
    
  • with 语句

    • 是将代码的作用域设置到一个特定的对象中
    var qs = location.search.substring(1);
    var hostName = location.hostname;
    var url = location.href;
    
    // 改为 with 语句
    with(location){
        var qs = search.substring(1);
        var hostName = hostname;
        var url = href;
    }
    
  • switch 语句

函数
  • 参数
    • 没有传递值的命名参数将自动被赋予 undefined 值
    • arguments 对象表示传入参数,长度与传入参数个数相等
    • 严格模式下,对 arguments[i] 的赋值无效
  • 不能重载

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

基本类型和引用类型的值
  • 基本类型:Undefined、Null、Boolean、Number、String

  • 引用类型:Object

  • 动态的属性

    • 可以动态的增删引用类型的属性和方法
  • 复制变量值

    • 对于引用类型的复制实为浅拷贝
  • 传递参数

    • 按值传递,把函数外部的值复制给函数内部的参数
  • 检测类型

    • typeof 操作符
    • instanceof 操作符
      • 判断是否为指定的引用类型
      • 当检测基本类型的值时,始终返回 false
执行环境及作用域
  • 作用域链

    • 作用域链的前端,是当前执行的代码所在环境的变量对象
    • 标识符解析是沿着作用域链逐级地向后回溯,搜索标识符的过程。
  • 延长作用域链

    • try-catch 语句的 catch 块
      • 会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明
    • with 语句
      • 会将指定的对象添加到作用域链中
  • 没有块级作用域

垃圾收集
  • 标记清除(常用)

    • 给 不在环境中 且没有被环境中变量引用的 变量加上标记,然后销毁他们的值并回收占用的内存空间
  • 引用计数

    • 当变量引用次数变为 0 时,回收其内存
  • 性能问题

    • 触发垃圾回收运行的阈值
  • 管理内存

    • 一旦数据不再有用时,设置为 null,解除引用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值