形参?实参?
- 形参:形式参数,函数声明时使用的参数,在调用时用于接收实参值的变量;
- 实参:实际参数,函数调用时,以值传递的方式发送给形参,可以是任何数据。
- 注意:
- 形参和实参个数不需要一致,
- 缺少实参会以
undefined
代替, - 缺少形参,多余的实参也会被
arguments
对象接收到;
- 缺少实参会以
- 值类型和引用类型的数据都是以值传递的方式传参,
- 值类型,直接将值赋值给形参声明的变量,
- 引用类型,将地址赋值给形参声明的变量,可能会影响原数据。
let o = {}
let o1 = {}function test1(obj) {obj.fizz = '嘶嘶' // 修改原数据
}
function test2(obj) {obj = { fizz: '' } // 不修改原数据,只是形参指针的指向不了
}test1(o)
console.log(o) // { fizz: '嘶嘶' }
test2(o1)
console.log(o1) // {}
arguments 对象
- 类数组对象,所有函数(箭头函数除外)函数体中都能使用的一个局部变量;
- 所有实参的数据,按照次序放入
arguments
,通过索引(0,1,2,…)读写; - 非严格模式下,存在复杂参时(默认参数、剩余参数、解构赋值参数),所有参数的行为都不会被
arguments
跟随; - 使用解构赋值参数,
arguments
会存储整个数据,而不是分别存储提取的数据; arguments
还有其他属性和方法,诸如length
、callee
等。
/* 存在复杂参数(非严格模式下) */
function f(a, ...r) {console.log(arguments[0], arguments[1]);a = 99; // arguments[0] 不会修改r[0] = 99; // arguments[1] 不会修改console.log(arguments[0], arguments[1]);
}
f(1, 2, 3) // 输出 1,2; 1,2/* 不存在复杂参数(非严格模式下) */
function g(a, b) {console.log(arguments[0], arguments[1]);a = 99; // arguments[0] 会修改b = 99; // arguments[1] 会修改console.log(arguments[0], arguments[1]);
}
g(1, 2) // 输出 1,2; 99,99/* 解构赋值参数 */
const writer = { id: 12, name: 'Li Hua' }
function h({ id, name }) {console.log(arguments[0], arguments.length);
}
h(writer) // 打印 { id: 12, name: 'Li Hua' }, 1(不是2)
默认参数
在参数列表中 =
的右端提供默认值。
function f(a=1, [b, c=b], { d=a }, ...rest) { return d; }
f(10, [], {}) // 10
剩余参数
就是将剩余的参数以数组的方式收纳起来;必须放在最后。
function g(a, ...rest) { return rest; }
g(1, 2, 3, 4) // [2, 3, 4]
解构赋值参数
就是提取到指定数据,进行指定传参。
let arr = [1, 2, 30]
const w = { name: 'Li Hua', gender: 0, score: 100 };function h([a, ,c], { name, score }) {console.log(a, c, name, score);
}