# JavaScript 速查

## let 与 const

常量声明的绑定不能重新赋值，变量声明用于需要改值的场景，两者都是块级作用域，也不存在变量提升带来的怪异行为。默认先写常量声明，确实要重新赋值时再换成变量声明，能少踩很多坑。

```javascript
const host = "127.0.0.1";
```

## 解构

数组按位置取值、对象按属性名取值，都能给默认值；剩余运算符把没取到的属性收进新对象，处理配置参数时特别方便，函数入参也支持同样的写法，不必再逐个读取属性字段。

```javascript
const [a, , c] = [1, 2];
```

## 箭头函数

省略函数关键字，单行表达式可以隐式返回。箭头函数没有自己的上下文对象，适合做回调，但不能拿来当构造函数使用，也没有参数对象，需要剩余参数时用三个点收集，别和普通函数混用。

```javascript
const add = (x, y) => x + y;
```

## Promise 与 async

异步函数返回承诺对象，等待表达式负责拆箱；并行请求交给全完成方法，失败用捕获语句接住，别让未捕获的拒绝静默丢失。串行地一个个等待会白白拉长总耗时，能并行就别排队等待。

```javascript
const p = Promise.resolve(1);
```

## 数组方法

映射、过滤、归约都返回新数组或聚合值，不改动原数组，可链式组合；查找返回首个匹配元素，找不到时给未定义值，判断是否存在用存在性方法更贴切，别把查找结果直接当布尔值用。

```javascript
const t = [1, 2].map(n => n * 2);
```

## 可选链与空值合并

可选链读取不存在的属性不会抛错，空值合并只在值为空或未定义时取默认值，不会误伤数字零和空字符串，比逻辑或更精确。方法调用同样能加问号，避免先判空再执行。

```javascript
console.log(cfg?.db?.port ?? 3306);
```
