💡 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
📌 代码块{...}的结果值是其最后一个语句/表达式的结果```javascriptvar 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
💡 逗号表达式 可以将多个表达式串联成一个语句```javascriptvar a = 1;var b = (a++ , a) // a 在 a++ 之后执行, 结果为 2 ,然后赋值给b (涉及运算符优先级)a; // 2b; // 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 // ? :
