03.JavaScript基础系列:常用的语句表达式

306 阅读6分钟

JavaScript基础系列

上期知识点回顾:表达式

加号算术运算符

加号的转换规则优先考虑字符串连接,其规则如下:

  • 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始值类(日期对象调用 toString() 进行转换;其他对象通过 valueOf() 进行转换,对于不具备 valueOf() 方法,会调用 toString() 方进行转换)
  • 对象到原始值转换后,如果其中一个操作数是字符串,会进行字符串连接
  • 否则,这个操作数都将转换为数字(或 NaN),进行加法操作

比较运算符

数字和字符串的比较规则如下:

  • 如果操作数是对象,将按照类型转换规则将其转换为原始值
    • 在对象转换为原始值之后,如果两个操作数都是字符串,按照字母表的顺序进行比较
    • 在对象转换为原始值之后,如果有一个操作数是数字,会将另外操作数转换为数字,进行比较
  • NaN 与任意操作数比较,都返回 false

数字和字符串操

对于数字和字符串操作符来说,加号运算符和比较运算符的行为有所不同。

  • 加号运算符更偏爱字符串,如果一个操作数是字符串,则进行字符串连接
  • 比较运算符更偏爱数字,如果一个操作数是数字,则进行数字的比较

语句

表达式在 JavaScript 中是短语,那么语句就是 JavaScript 整句或命令,用分号作为语句的分隔符。

表达式计算出一个值,语句用来执行以使某件事发生。

常用的语句表达式

语句                     用途
break                   退出最内层循环或退出 switch 语句或退出label 执行的语句
caseswitch 语句中标记一条语句
continue                重新开始最内层的循环或重新开始 label 指定的循环
debugger                断电器调试
defaultswitch 中标记默认的语句
do/while                while 循环的一种替代行为
empty                   什么都不做				
for                     一种简写的循环
for/in                  遍历一个对象的属性
function                声明一个函数
if/else                 条件判断
return                  从函数返回一个值
switchcase 或者 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 会抛异常