了解Javascript函数的参数

7/29/2021 函数参数

# 了解Javascript函数的参数

Javascript语言可能是世界上最不关心函数参数的语言。它既不关心传入参数的个数,也不关心这些参数的数据类型。所以,嘲讽一个人时,作为一个前端程序员,大可以用“你对社会的价值,就像JS函数里的参数一样————可有可无”。

  1. # arguments对象

在使用function关键字定义(非箭头)函数时,可以在函数内部访问到arguments对象,从中取得传进来的每个参数值。 arguments对象是一个类数组对象
那么什么是类对象数组呢?
类数组对象是指可以通过索引属性访问元素并且拥有length属性的对象

let arrayLike = {
    0:'name',
    1:'age',
    2:'job',
    length:3,
}
let arr1 = Array.from(arrayLike); // ['name','age','job']
1
2
3
4
5
6
7

上面例子中的arrayLike就是类数组对象,并且可以通过Array.from方法将类数组对象转成数组;

Javascript语言可能是世界上最不关心函数参数的语言。它既不关心传入参数的个数,也不关心这些参数的数据类型。所以,嘲讽一个人时,作为一个前端程序员,大可以用“你对社会的价值,就像JS函数里的参数一样————可有可无”。

事实上,定义函数的参数只是为了方便才写出来的,而不是必须写出来的。在调用函数时,所有的参数都会顺序保存在arguments对象里。命名参数与对应位置的arguments中存储的值是同步的,也就是修改两者任意一个值,会自动同步到对应的另一个值。但这并不是说两者两者访问同一个内存地址,它们在内存中还是分开的,只不过会保持同步而已。如果传入的参数比命名参数少了,那么后面的参数就自动设值为undefined,这就是定义了变量而没有初始化。

  1. # ES6的默认参数值

在ES6的写法中,只要在函数定义的参数后用=就可以为参数赋一个默认值。

function createPeople(name='will',age='29',job='engineer'){
    return `Hello, My name is ${name}, ${age}, and I am a ${job}.`;
}

createPeople() // "Hello, My name is will, 29, and I am a engineer."
1
2
3
4
5

# 默认参数作用域 与 暂时性死区

  • 函数的多个参数设置默认参数时类似使用let顺序声明多个变量
  • 如果有参数A的默认值是某一个参数B,那么B的声明必须在前面,否则会出现暂时性死区