💡 JavaScript
语法定义了词法规则(运算符、关键字)是如何构成可运行的程序代码
参考英语语法
- “句子”是完整表达某个意思的一组词,由一个或多个“短语”组成;
- “短语”由标点符号或连接词连接起来;
- “短语”可以由更小的“短语”组成;
有的“短语”不完整,不能独立表达完整意思,有的短语完整,可以独立表达完整意思
语句和表达式
语句是表达完整意思的一组词,由一个或多个表达式构成,表达式由运算符连接起来
- 表达式可以返回一个结果值
var a = 1 + 1; // 1 + 1 是表达式,返回2 var a = 1 + 1 是声明语句
var b = a; // a是表达式,返回2, var b = a 是声明语句
b; // b是表达式,返回2 b 也是语句,可以叫做表达式语句(虽然没有什么意思)
这三行代码都是包含表达式的语句
语句的结果词
📌 语句都有一个结果值(undefined
也算),获得结果最直接的方法就是在浏览器开发控制台中输入语句,默认情况下就会显示执行最后一条语句的结果值
```javascript var a = 1 // 这里返回的是 undefined
/*/
var a = 1; a // 这里返回的是1
📌 代码块{...}的结果值是其最后一个语句/表达式的结果
```javascript
var a;
if (true) {
a = 1 + 1
}
// 这里直接返回 2
a++ 与 ++a
a++/a--
,运算符在后,先赋值,后自增/自减++a/--a
,运算符在前,先自增/自减,后赋值 ```javascript var a = 1 var b = a++ // a先赋值给b,然后再自增1 a // 2 b // 1
/**/
var a = 1 var b = ++a // a先自增1,然后再赋值给b a // 2 b // 2
💡 逗号表达式 可以将多个表达式串联成一个语句
```javascript
var a = 1;
var b = (a++ , a) // a 在 a++ 之后执行, 结果为 2 ,然后赋值给b (涉及运算符优先级)
a; // 2
b; // 2
上下文规则
在JavaScript语法规则中,有时候相同的语法在不同情况下有不同的解释
大括号{}
对象常量
var a = {
foo: bar() // 这里假设 bar() 已经被定义过
}
// 这里将 {...} 赋值给 a,所以它是个对象常量
标签
{
foo: bar() // 这里假设 bar() 已经被定义过
}
// 这里 {...} 是一个普通的代码块
代码块
- 😂一个涉及强制隐式转换的坑 ```javascript [] + {} // “[object Object]” // {} 出现在 + 运算符表达式中,它被当做一个值(空对象)处理, // [] 强制转换为 “”, {} 强制转换为 “[object Object]”, “” + “[object Object]” 结果为 “[object Object]”
/**/
{} + [] // 0
// {} 被当做一个独立的空代码块(不执行任何操作),+ [] 将 [] 强制转换为 0
- 对象解构
- else if 和可选代码块
- 实际上js中没有else if
```javascript
// else if 实际上是这样
if (a) {
//...
} else {
if (b) {
// ...
} else {
// ...
}
}
运算符优先级
优先级
参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
关联性 a OP b OP c
// 左关联
(a OP b) OP c
// 右关联
a OP (b OP c)
📢 关联性对执行顺序的影响只在运算符优先级相同的情况下生效
a && b || c ? c || b ? a : c && b : a // 🤦♂️
// 优先级 && 💨 || 💨 ? : 💨 =
(a && b) || c ? c || b ? a : (c && b) : a // &&
((a && b) || c) ? (c || b) ? a : (c && b) : a // ||
((a && b) || c) ? ((c || b) ? a : (c && b)) : a // ? :