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

2.7 KiB

通用概念 · 三种调用形式:值.方法() vs 函数() vs 类.方法()

跨主题概念,不属于某一天。困惑"什么时候用点、什么时候传参"时看这篇。

核心问题:这个函数"属于"谁?

形式一:值.方法() —— 方法(method)

函数属于某个值/对象,是它"自带的能力",用点 . 调用。 点前面那个值 = 被操作的主角,不用再传进去。

'hello'.toUpperCase() // toUpperCase 是字符串自带的能力
;[1, 2, 3].map((x) => x * 2) // map 是数组自带的能力
'a,b'.split(',') // split 属于字符串

形式二:函数(值) —— 独立函数(function)

函数不属于任何特定值,是自由的工具,数据当参数传进括号

Number('42') // 转谁就传谁进去
parseInt('42px')
isNaN(x)

形式三:类.方法(值) —— 静态方法(static method)

函数挂在某个类/工具箱下做归类,数据仍然传进去

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. 类型转换/数学/解析类工具 → 大多 函数()类.方法()(NumberMath.JSON.parse)
  3. Math. / JSON. / Object. / Array. 开头 → 几乎都是静态方法,数据传进去

记忆诀窍

问:"这是某个值天生就会的,还是外部工具对它做的?"

  • 天生就会(大写化、截取、拆分)→ 值.方法()
  • 外部工具处理它(转类型、算最值、解析)→ 函数(值) / 工具箱.方法(值)

🔧 实用技巧

不确定时,在编辑器里敲 值. 看自动补全弹什么 —— 弹出来的就是它自带的方法; 没弹出来的,就得找独立函数或静态方法。让 VS Code 帮你查最快。