2.函数参数 - JS

形参?实参?

  1. 形参:形式参数,函数声明时使用的参数,在调用时用于接收实参值的变量;
  2. 实参:实际参数,函数调用时,以值传递的方式发送给形参,可以是任何数据。
  1. 注意:
  • 形参和实参个数不需要一致,
    • 缺少实参会以 undefined 代替,
    • 缺少形参,多余的实参也会被 arguments 对象接收到;
  • 值类型和引用类型的数据都是以值传递的方式传参,
    • 值类型,直接将值赋值给形参声明的变量,
    • 引用类型,将地址赋值给形参声明的变量,可能会影响原数据;
  • 函数体内部默认声明过形参表示的变量,不要重复声明。
let o = {}
let o1 = {}

function test1(obj) {
	obj.fizz = '嘶嘶'	// 修改原数据
	// const obj; 这是报错的,不能重复声明
	// let obj; 这是报错的,不能重复声明
}
function test2(obj) {
	obj = { fizz: '' }	// 不修改原数据,只是形参指针的指向不了
}

test1(o)
console.log(o)	// { fizz: '嘶嘶' }
test2(o1)
console.log(o1)	// {}

arguments 对象

  1. 类数组对象,所有函数(箭头函数除外)函数体中都能使用的一个局部变量;
  2. 所有实参的数据,按照次序放入 arguments,通过索引(0,1,2,…)读写;
  3. 非严格模式下,存在复杂参时(默认参数、剩余参数、解构赋值参数),所有参数的行为都不会被 arguments 跟随;
  4. 使用解构赋值参数,arguments 会存储整个数据,而不是分别存储提取的数据;
  5. arguments 还有其他属性和方法,诸如 lengthcallee 等。
/* 存在复杂参数(非严格模式下) */
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);
} 


你可能感兴趣的:(#,JS,函数进阶,javascript,前端,开发语言,ecmascript,学习,笔记)