第三章 基本概念
语法
-
变量、函数名和操作符都区分大小写
-
标识符
- 即变量、函数、属性(包括函数的参数)的名字
- 第一个字符必须是一个字母、下划线或美元符号
- 其他字符可以是字母、下划线、美元符号或数字
- 小驼峰格式
-
严格模式
- 为 JavaScript 定义了一种不同的解析与执行模型
- 在严格模式下,ES3 中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误
- 启用严格模式,添加代码:
"use strict";
-
语句
- 推荐使用分号结尾(省略分号时,由解析器确定语句的结尾)
- 推荐始终在控制语句中使用代码块,即使代码块中只有一条语句(防止压缩错误)
关键字和保留字
let
和yield
是 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)
- 非数值,用于表示一个本来要返回数值的操作数未返回数值的情况(如除 0)
-
数值转换
- Number(),可用于任何类型
- Number(null) -> 0
- Number(undefined) -> NaN
- Number("") -> 0
- Number(“Hello”) -> NaN
- parseInt(),用于字符串类型
- parseInt(string, radix) // 待转换的字符串,基数(即多少进制)
- 遇到第一个非数字字符时终止(包括小数点)
- parseInt("") -> NaN
- parseInt(“123blue”) -> 123
- parseFloat(),用于字符串类型
- 解析到遇见一个无效的浮点数字字符为止(第二个小数点无效)
- 始终忽略前导 0
- 只解析十进制
- Number(),可用于任何类型
-
-
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”
- toString() 方法
-
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 语句
- 会将指定的对象添加到作用域链中
- try-catch 语句的 catch 块
-
没有块级作用域
垃圾收集
-
标记清除(常用)
- 给 不在环境中 且没有被环境中变量引用的 变量加上标记,然后销毁他们的值并回收占用的内存空间
-
引用计数
- 当变量引用次数变为 0 时,回收其内存
-
性能问题
- 触发垃圾回收运行的阈值
-
管理内存
- 一旦数据不再有用时,设置为 null,解除引用