犀牛书笔记(第5章 语句)

犀牛书笔记(第5章 语句)

表达式语句:

最简单的语句,有副效应的表达式。如,赋值语句,自增自减,delete,函数调用。

复合语句与空语句:

语句块将多个语句组合为一个复合语句。

复合语句允许我们在JavaScript语法期待一个语句时使用多个语句。而空语句正好相反,它让我们在期待一条语句的时候不包含任何语句。空语句是一个单独的分号,可用于创建一个没有循环体的循环。

条件语句:

else if 并不是真正的javascript语句,而是一个在使用if/else时被频繁用到的编程惯例。

case语句:ECMAScript标准允许每个case后面跟任意的表达式。匹配使用的是===,不是==。考虑到依次求值case语句时,执行的语句不确定,所以最好不要把有副作用的表达式放到case后面。

循环语句:

JavaScript有5种语句,while, do/while, for, for/of, for/in

while是最基本的循环语句,没什么可说的。

do/while跟while的区别是,判断条件在最后,所以至少执行一次循环体。while判断条件必须以分号结尾。

for循环的initialize, test, increment都可以省略,只有2个分号是必须的。

for/of: 专用于可迭代对象。包括数组、字符串、集合、映射。对象默认是不可迭代的,如果想迭代对象的属性,可以使用for/in循环,或者基于Object.keys(o)/Object.values(o)/Object.entries(o)做迭代。字符串是按照Unicode码点而不是UTF-16字符做迭代。

ES2018增加了一种新的迭代器,称为异步迭代器,同时新增了一种for/of循环,即for/await. 读到异步章节再深究。

for/in: 可以用来迭代任意对象。不会枚举对象的所有属性,比如不会枚举名字为符号的属性。对于名字为字符串的属性,它只会遍历可枚举的属性。Js核心定义的各种内部方法是不可枚举的。比如所有对象都有toString()方法,但是for/in循环不会枚举toString属性。

跳转语句:break/continue/return/yield/throw/try-catch-finally

break label; 这种用法要注意,break和label必须在同一行。另外,无论带不带标签,break语句都不能把控制权转移到函数边界之外。

continue语句:无论带不带标签,continue都只能在循环体内使用。注意continue语句在while和for循环中行为的差异:while直接返回到它的条件,但是for会先求increment表达式,再返回条件。所以for和while不是完全等价的。

yield: 类似于return, 但只能用在ES6新增的生成器函数中,以回送生成的值序列中的下一个值,同时又不会真正返回。

catch: 如不关心具体的异常信息,可以不加圆括号和e局部变量。(ES2019之后)

finally: 如果finally块本身由于return/continue/break/throw导致跳转,或者调用的方法抛出了异常,则解释去会抛弃等待的跳转,执行新跳转。例如,如果finally子句抛出了异常,该异常会代替正被抛出的其他异常。如果finally子句执行了return语句,则相应方法正常返回,即使有被抛出且尚未处理的异常。

其他语句:

with/debugger/use strict

with: 运行一个代码块,就好像指定对象的属性是这个代码块作用域中的变量一样。严格模式禁用。很少用。

debugger: 使用浏览器且打开了开发者工具,这个语句就会导致断点。

use strict: 1. 不包含任何语言关键字,2. 只能出现在脚本或函数体的开头。任何位于class体或ES6模块中的代码都默认为严格代码,无需显式指明。

严格模式的区别:1. 不允许with语句;2. 所有变量必须声明,否则会报错ReferenceError; 3. 函数如果作为非方法调用,this值为undefined. [在严格模式下,函数通过call/apply调用,this是第一个参数的值] 4. 给不可写的属性赋值或尝试在不可扩展的对象上创建新属性会抛出TypeError. 5. 传给eval的代码不能像在非严格模式下那样在调用者的作用域中声明变量或定义函数。6. 严格模式下函数的Arguments对象保存的是副本而不是引用。7. delete不存在的变量会抛出SyntaxError 8. 尝试删除不可配置的额属性会抛出TypeError; 9. 对象字面量定义两个或多个同名属性是语法错误;10. 函数生命中有两个同名参数是语法错误;11. 不允许使用八进制整数字面量;12. eval和arguments不允许赋值。13. 检查调用栈的能力受限制。

声明:

const/let/var/function/class/import/export

发表回复

*您的电子邮件地址不会被公开。必填项已标记为 。

*
*