You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30-Days-Of-JavaScript/js_notes/00-concepts/call-forms.md

68 lines
2.7 KiB

# 通用概念 · 三种调用形式:`值.方法()` vs `函数()` vs `类.方法()`
> 跨主题概念,不属于某一天。困惑"什么时候用点、什么时候传参"时看这篇。
## 核心问题:这个函数"属于"谁?
### 形式一:`值.方法()` —— 方法(method)
函数**属于某个值/对象**,是它"自带的能力",用点 `.` 调用。
**点前面那个值 = 被操作的主角**,不用再传进去。
```js
'hello'.toUpperCase() // toUpperCase 是字符串自带的能力
;[1, 2, 3].map((x) => x * 2) // map 是数组自带的能力
'a,b'.split(',') // split 属于字符串
```
### 形式二:`函数(值)` —— 独立函数(function)
函数**不属于任何特定值**,是自由的工具,数据当参数**传进括号**。
```js
Number('42') // 转谁就传谁进去
parseInt('42px')
isNaN(x)
```
### 形式三:`类.方法(值)` —— 静态方法(static method)
函数挂在某个**类/工具箱**下做归类,数据仍然**传进去**。
```js
Array.isArray([1, 2, 3]) // isArray 挂在 Array 名下
Math.max(1, 2, 3) // max 挂在 Math 名下
Number.isNaN(x) // 挂在 Number 名下
Object.keys(obj) // 挂在 Object 名下
```
> ⚠️ 区分:`Array.isArray(arr)` 的 `Array`(大写=类/工具箱)和 `[1,2,3].map()` 点前的
> 数组实例(具体的值)是两回事。**大写开头 = 工具箱;点前是具体值 = 实例。**
## 对照表
| 形式 | 例子 | 数据在哪 | 感觉 |
|---|---|---|---|
| `值.方法()` | `'hi'.toUpperCase()` | **点前面** | 值自带的能力 |
| `函数(值)` | `Number('42')` | **括号里** | 自由工具 |
| `类.方法(值)` | `Array.isArray(x)` | **括号里** | 工具箱里的工具 |
## "什么时候用哪个"?
**真相:不是你选的,是语言设计时定死的。** 每个功能造出来就固定了形式,只能记/查。
- 转大写只能 `str.toUpperCase()`,不能 `toUpperCase(str)`
- 判断数组只能 `Array.isArray(x)`,不能 `x.isArray()`
但有规律可猜:
1. **操作字符串/数组/对象内容的** → 大多 `值.方法()`
2. **类型转换/数学/解析类工具** → 大多 `函数()``类.方法()`(`Number`、`Math.`、`JSON.parse`)
3. **`Math.` / `JSON.` / `Object.` / `Array.` 开头** → 几乎都是静态方法,数据传进去
## 记忆诀窍
> 问:**"这是某个值天生就会的,还是外部工具对它做的?"**
> - 天生就会(大写化、截取、拆分)→ `值.方法()`
> - 外部工具处理它(转类型、算最值、解析)→ `函数(值)` / `工具箱.方法(值)`
## 🔧 实用技巧
**不确定时,在编辑器里敲 `值.` 看自动补全弹什么** —— 弹出来的就是它自带的方法;
没弹出来的,就得找独立函数或静态方法。让 VS Code 帮你查最快。