分号
1. 自动插入分号规则
(1)有换行符,且下一个符号是不符合语法的,自动插入分号;
(2)有换行符,且语法中规定此处不能有换行符,自动插入分号;
1)带标签的continue语句,不能在continue后插入换行;
2)带标签的break语句,不能在break后插入换行;
3)return后不能插入换行;
4)后自增、后自减运算符前不能加入换行
5)throw和Exception之间不能插入换行
6)凡是async关键字,后面都不能插入换行
7)箭头函数的箭头前,也不能插入换行
8)yield之后,不能插入换行
(3)源代码结束处,不能形成完整的脚本或模块结构,自动插入分号;
2. 带换行符的注释也被认为是有换行符
return 和 结果之间有换行的注释,则返回undefined。
3. 不写分号需要注意的情况
(1)以括号开头的语句
(2)以数组开头的语句
(3)以正则表达式开头的语句
(4)以Template开头的语句
export
1. 模块和脚本
(1)模块和脚本之间的区别在于是否包含import和export
(2)脚本具有主动性的JavaScript代码段,是控制宿主完成一定任务的代码;而模块是被动性的JavaScript代码段,是等待被调用的库。
(3)现代浏览器支持script标签引入模块或脚本。如果引入模块,必须给script标签添加type=“module”。如果引入脚本,则不需要type。
(4)脚本中可以包含语句。模块中可以包含三种内容:import声明,export声明和语句。
2. import声明
(1)直接import一个模块
import “mod”
只是保证这个模块被执行,无法获得任何信息
(2)带from
import v from “mod”
引入模块中的一部分信息,可以把它们变成本地的变量
import x from “./a.js” //引入模块中导出的默认值
import {a as x, modify} from “./a.js” // 引入模块中的变量
import * as x from “./a.js” //把模块中所有的变量以类似对象属性的方式引入
import d, {a as x, modify} from “./a.js”
Import d, * as x from “./a.js
3. 函数体
(1)普通函数体
function foo() {}
(2)异步函数体
async function foo() {}
(3)生成器函数体
function *foo() {}
(4)异步生成器函数体
async function *foo() {}
image
4. 预处理
代码都是先编译在执行,实际上变量和函数声明在代码里的位置是不会变的,而且是在编译阶段被JavaScript引擎放入内存中。
var声明
1) 函数体级var定义的不会访问外层
2) var作用能够穿透一切语句结构,除了脚本、模块和函数体
面试题:文档添加20个div元素,绑定了点击事件,打印序号
for(var i = 0; i < 20; i++) {
void function(i) {
var div = document.createElement('div')
div.innerHTML = i
div.onclick = function() {console.log(i)}
doument.body.appendChild(div)
}(i)
}
function声明
console.log(foo)
function foo() {}
// foo() {}
console.log(foo)
if(true) {
function foo() {}
}
// undefined
class声明
console.log(c)
class c {}
// c is not defined
var c = 1
function foo() {
console.log(c)
class c {}
}
foo()
//报错:c不可以在初始化之前使用
指令序言机制
'use strict'
用 babel,分析一段 JavaScript 的模块代码,并且找出它中间的所有 export 的变量。
语句
image imagebreak用于跳出循环或switch语句,continue用于结束本次循环并继续循环
var的规则:
声明同时必定初始化;尽可能在离使用的位置近处声明;不要在意重复声明;
class默认内部函数定义都是strict模式的
生成器函数可以理解为返回一个序列的函数,底层是iterator机制。
表达式语句
原子项
基本类型的直接量
"abc"
123
null
true
false
直接量的形式定义对象
({})
(function(){})
(class{ })
[]
/abc/g
this或变量(标识符引用)
this
myVar
任何表达式加上()
(a + b)
成员表达式
用于访问对象成员
a.b
a["b"]
new.target
super.b
f`a${b}c`
new Cls()
new 表达式
new new Cls(1)
// 等价于
new (new Cls(1))
函数调用表达式
a.b(c)
super()
a.b(c)(d)(e)
a.b(c).d
a.b(c)`xyz`
函数调用表达式比new表达式优先级低
左值表达式
a() = b
a().c = b
赋值表达式
a = b
a = b = c = d
// 等价于
a = (b = (c = d))
a += b
运算符表达式 0397a1bd093f91618c30f5afc93a8b0.png
表达式
更新表达式
++、--
一元运算表达式
delete a.b
void a
typeof a
-a
~a
!a
await a
乘方表达式
++i ** 30
2 ** 30 // 正确
-2 ** 30 // 报错
4 ** 3 ** 2 // 等价于 4 ** (3 ** 2)
乘法表达式(除法、取余)
加法表达式
移位表达式
<<向左移位
>>向右移位
>>>无符号向右移位
关系表达式
<=
>=
<
>
instanceof
in
相等表达式
==
!=
===
!==
网友评论