JavaScript 函数参数怎么传
不少刚接触编程的朋友,写代码时总在函数参数上“卡壳”——明明照着教程抄的代码,换个参数就报错,传多传少都不对,甚至不知道该传字符串还是数字。其实函数参数的传递逻辑,像极了日常“递东西”,一点就通。
先搞懂:函数参数就是“给函数递的材料”
你可以把函数想象成一个奶茶店的制作机,要做奶茶,得递“茶叶、牛奶、糖量”这些材料,这些就是参数。比如想做三分糖的珍珠奶茶,就得告诉机器:用红茶茶叶、纯牛奶、放3勺糖。

举个生活化的小例子:假设你写了个做早餐的函数,功能是“把面包和火腿夹成三明治”,那你得给这个函数递“面包片、火腿片”这两个参数。如果只递了面包,函数就不知道该夹什么,自然做不出三明治。
最基础的两种传递方式:值传递和引用传递
很多人会被“值传递”“引用传递”绕晕,其实用你常用的东西就能分清楚:
值传递:递的是“复印件”
如果参数是数字、字符串这种简单类型,传的就是值的“小抄”。比如你写个计算总价的函数:function calcPrice(price, tax) { return price + tax; },调用时传calcPrice(10, 2),函数拿到的是10和2的“复印件”,不管函数里怎么改这两个数,原来的10和2都不会变。就像你给朋友递一张你家的地址复印件,朋友改的是复印件,你家真实地址不会变。
引用传递:递的是“家门钥匙”
如果参数是数组、对象这种复杂类型,传的是它们的“钥匙”——也就是内存地址。比如你写个改数组的函数:function addItem(arr) { arr.push('牛奶'); },调用时传let myFood = ['面包']; addItem(myFood),你会发现原来的myFood变成了['面包', '牛奶']。就像你把你家钥匙给朋友,朋友用这把钥匙直接进你家放东西,你家的东西自然就变了。
这里有个小坑要注意:如果直接给引用参数重新赋值,就像把钥匙扔了换了新钥匙,不会影响原来的东西。比如function changeArr(arr) { arr = ['鸡蛋']; },再调用changeArr(myFood),myFood还是['面包', '牛奶'],因为你只是给函数换了个新钥匙,原来的钥匙对应的家没改。
实际用的时候,别踩这几个小坑
第一,参数传多传少都没事。JavaScript不会像有些语言那样报错,传多了多余的参数会被忽略,传少了没传的参数会变成undefined。比如你写的函数需要两个参数,只传一个,函数里没传的那个就相当于没定义,可能出问题,最好养成传对应参数的习惯。
第二,别搞混默认值。ES6之后可以给参数设默认值,比如function greet(name = '朋友') { return 你好,${name}; },不传name的话,会自动用“朋友”,不用再写判断name || '朋友',更省心。
第三,不确定参数数量?用剩余参数。如果函数要处理不定量的参数,比如算一堆数字的总和,不用一个个写参数,用function sum(...nums) { return nums.reduce((a, b) => a + b, 0); },调用时sum(1,2,3)就会把1、2、3都放进nums这个数组里,灵活又方便。
其实JavaScript函数参数的传递,本质就是“递东西”的逻辑:递复印件改不了原物,递钥匙能改原物,传多传少看需求,加了默认值就不用怕漏传。多写几个小例子试试,很快就能摸透规律。