JavaScript基础系列
上期知识点回顾:表达式
加号算术运算符
加号的转换规则优先考虑字符串连接,其规则如下:
- 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始值类(日期对象调用 toString() 进行转换;其他对象通过 valueOf() 进行转换,对于不具备 valueOf() 方法,会调用 toString() 方进行转换)
- 对象到原始值转换后,如果其中一个操作数是字符串,会进行字符串连接
- 否则,这个操作数都将转换为数字(或 NaN),进行加法操作
比较运算符
数字和字符串的比较规则如下:
- 如果操作数是对象,将按照类型转换规则将其转换为原始值
- 在对象转换为原始值之后,如果两个操作数都是字符串,按照字母表的顺序进行比较
- 在对象转换为原始值之后,如果有一个操作数是数字,会将另外操作数转换为数字,进行比较
- NaN 与任意操作数比较,都返回 false
数字和字符串操
对于数字和字符串操作符来说,加号运算符和比较运算符的行为有所不同。
- 加号运算符更偏爱字符串,如果一个操作数是字符串,则进行字符串连接
- 比较运算符更偏爱数字,如果一个操作数是数字,则进行数字的比较
语句
表达式在 JavaScript 中是短语,那么语句就是 JavaScript 整句或命令,用分号作为语句的分隔符。
表达式计算出一个值,语句用来执行以使某件事发生。
常用的语句表达式
语句 用途
break 退出最内层循环或退出 switch 语句或退出label 执行的语句
case 在 switch 语句中标记一条语句
continue 重新开始最内层的循环或重新开始 label 指定的循环
debugger 断电器调试
default 在 switch 中标记默认的语句
do/while while 循环的一种替代行为
empty 什么都不做
for 一种简写的循环
for/in 遍历一个对象的属性
function 声明一个函数
if/else 条件判断
return 从函数返回一个值
switch 用 case 或者 default 语句标记多分支语句
throw 抛出异常
try 捕获异常
use strict 应用严格模式
var 声明并初始化变量
while 基本的循环结构
with 扩展作用域链
1.表达式语句
- 赋值语句: =、++、-- 等等
- 函数调用: fun()
- delect 运算符 : delete obj.p
- ...
2.复合语句和空语句
JavaScript 可以将多条语句联合在一起,形成一条复合语句,需要用花括号将多条语句括起来。
- 语句块的结尾不需要分号,块中的原始语句需要用分号结束
- 需要有缩进,但不是必需
- JavaScript 没有块级作用域
空语句是只包含0条语句的语句。
for (i = 0; i < a.lenght; a[i++]=0) ; // 空语句,结尾有个分号
3.声明语句
var 和 function 都是声明语句,他们声明或定义变量或函数。
var
如果在顶层代码中使用 var 语句,它声明的变量是个全局变量,全局变量是全局对象的属性,然后和其他全局对象属性不同的,即无法通过 delete 删除。
var 语句同样可以作为 for 循环或者 for/in 循环的组成部分(和在循环之外声明的变量声明一样,都会 "提前" 声明)。
function
函数声明语句的语法如下:
function functionName ([arg1, [, arg2 [..., argn]]]) {
statements
}
4.条件语句
条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句。
- if
- else if
- switch:
- 在函数中使用 switch 语句,return 和 break 的效果是一样的
- 对每个 case 的匹配操作是执行的 === 运算符比较
5.循环
循环语句就是程序路径的一个回路,可以让一部分代码重复执行。
- while
- do/while
- for: for (initialize; test; increment)
- for/in:
- for (variable in object)
- for/in 只遍历可枚举的属性
跳转
- break: 跳转到循环或者其他语句的结束
- continue: 终止本次循环的执行并开始下一次循环的执行
- return: 跳出函数体的执行
- throw: 抛出一个异常,复杂的跳转语句
throw 语句
当发生了某种异常情况或错误时产生的一个信号。JavaScript 解释器抛出异常采用 Error 类型或其子类型。一个 Error 对象有一个 name 属性表示错误类型,一个 message 属性存放传递给构函数的字符串。
当抛出异常时,JavaScript 解释器会立即停止当前正在执行的逻辑,跳转到就近的异常处理程序。
异常处理程序的查找会沿着 JavaScript 方法的语法结果和调用栈向上传播,如果没有找到任何异常处理程序,JavaScript 会把异常当成程序错误来处理,并报告给用户。
try {
throw new Error('test')
} catch(err) {
console.info(err.name) // Error
console.info(err.message) // test
}
try {
a + 1;
} catch(err) {
console.info(err.name) // ReferenceError
console.info(err.message) // a is not defined
}
try/catch/finally
try {
// 通常来讲,这里不会出现任何问题
// 但有时会抛出一个异常
} catch(e) {
// 当 try 语句块抛出了异常,才会执行到这里
// 可以通过 e 来获得对 Error 对象或者抛出其他值的引用
// 可以忽略这个异常,还可以通过 throw 语句重新抛出异常
} finally {
// 总会执行的语句,终止 try 语句块的方式:
// 1.正常终止
// 2.通过 break、continue、或 return
// 3.抛出一个异常,被 catch 从句捕获
// 4.抛出一个异常,未被捕获,继续向上传播
}
try/catch/finally 执行顺序
- try 语句块
- 局部的 catch 从句
- finally 语句块
- 先上传播发现的 catch 从句
7.其他语句类型
- with
- debugger
- use strict
严格模式
- 禁止使用 with 语句
- 所有变量都要先声明
- 调用的函数(不是方法) 中的一个 this 值是 undefined
- 当通过 call() 或 apply() 来调用函数时,其中的 this 值是通过 call() 或 apple() 传入的第一个参数
- 传入 eval() 的代码不能在调用程序所在的上下文中声明变量或定义函数
- 函数里的 arguments 对象拥有传入函数值的静态副本
- delete 运算符后跟随非法的标识符(比如变量、函数、函数参数)时,会抛出错误
- 不能定义两个或多个同名属性
- 不允许使用八进制整数直接量
- 标识符 eval 和 arguments 当做关键字,它们的值不能更改
- 限制了对调用栈的检测能力,arguments.caller 和 arguments.callee 会抛异常