Javascript的参数分为实参和形参两种类型:
实参:从字面意义我们可以理解为“实际存在的参数”,是在函数调用时传给函数的变量,该变量在函数执行时必须存在。实参可以为变量、常量、函数、表达式等。
形参:从字面意义我们可以理解为“形式上存在的参数”,由此我们可以看出它并不是真实存在的参数,又称为虚拟变量。它在函数定义时使用,作用为接收函数调用时的实参。
在JavaScript中实参与形参数量并不需要像JAVA一样必须在数量上严格保持一致,具有很大的灵活性。如下:
function test(str1, str2, str3) {
// ......
}
test(); // str1: undefined, str2: undefined, str3: undefined
test('hello'); // str1: 'hello', str2: undefined, str3: undefined
test('hello', 'world'); // str1: 'hello', str2: 'world', str3: undefined
test('hello', 'world', '!'); // str1: 'hello', str2: 'world', str3: '!'
在JavaScript代码运行过程中,形参的作用为接收实参,它们两个分别位于不同的内存地址中,大致可以分为两种情况:
实参为原始值。当实参为原始值时,此时形参为实参的拷贝。因此,函数体内形参值的改变并不会影响实参。
function test(str) {
str = 'chinese';
return str;
}
const str1 = 'china';
const str2 = test(str1);
console.log(str1); // china
console.log(str2); // chinese
实参为引用值。当实参为引用值时,此时形参为实参内存地址的拷贝。因此,函数体内形参值的变化在一定情况下将会影响实参。
function test(obj) {
// 形参obj的值实际上为实参obj的内存引用,及形参与实参同时指向同一个内存地址。
obj.name = 'typeScript'; // 此时改变的为形参与实参同时指向的那个内存地址中的值
// 所以此时也导致实参的name属性发生了变化
obj = { // 此时对形参obj进行重新赋值,给予了它一个新的内存地址
name: 'react', // 从此之后的形参将于实参完全解绑,两者之前不再存在联系
star: 13000,
}
obj.star = 20000; // 所以这里仅仅是改变了形参的star属性
return obj;
}
const obj1 = {
name: 'javaScript',
star: 100000,
}
const obj2 = test(obj1);
console.log(obj1); // name: 'typeScript', star: 100000
console.log(obj2); // name: 'react', star: 20000
以上为个人见解,如有问题,欢迎斧正。