# 通用概念 · 三种调用形式:`值.方法()` 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 帮你查最快。