美文网首页
22.函数参数的默认值和剩余参数

22.函数参数的默认值和剩余参数

作者: 静昕妈妈芦培培 | 来源:发表于2022-02-11 16:55 被阅读0次

函数参数的默认值

1. ES5及之前给函数参数设置默认值

function foo(m, n) {
  m = m || "aaa";
  n = n || "bbb";
  console.log(m, n);
}
//写法麻烦,阅读性差 且有bug
foo(0, ""); // aaa bbb
foo(null, NaN); // aaa bbb

像0 '' null NaN 这些被转换为布尔值为false的值,作为参数传给foo,依然会取默认值

2. ES6给函数参数设置默认值:

  • 至于在传入的参数为undefined时,才会使用参数的默认值
  • 函数调用时,不传参数,默认传入的参数就是undefined
function bar(m = "aaa", n = "bbb") {
  console.log(m, n);
}
bar(0, ""); // 0 ''
bar(null, NaN); // null, NaN
bar(undefined,undefined) // aaa bbb
bar() // aaa bbb
对象参数和默认值以及解构
function printInfo({ name, age } = { name: "why", age: 18 }) {
  console.log(name, age);
}
printInfo(); //why 18
printInfo({ name: "kobe", age: 40 }); //kobe 40

另一种写法

function printInfo1({ name = 'why', age = 18 } = {}) {
  console.log(name, age);
}
printInfo1(); //why 18
printInfo1({ name: "kobe", age: 40 }); //kobe 40
有默认值的参数最好放到最后
function baz(m = "aaa", n, z) {
  console.log(m, n, z);
}
baz(undefined, "bbb", "ccc"); //aaa bbb ccc
function baz(n, z, m = "aaa") {
  console.log(m, n, z);
}
baz("bbb", "ccc"); //aaa bbb ccc

函数的length属性

  • 为函数的形参的个数
  • 如果某个参数有默认值,此参数及其后的参数,不计算在length中
function sum(m, n) {
  return m + n;
}
console.log(sum.length); //2

function mul(x, y, z) {
  return x * y * z;
}
console.log(mul.length); //3
function foo(x, y, z = 1) {}
console.log(foo.length); //2 如果某个参数有默认值,此参数及其后的参数,不计算在length中

function bar(x, y, z = 1, a, b, c) {}
console.log(bar.length); //2 如果某个参数有默认值,此参数及其后的参数,不计算在length中

函数的剩余参数(res parameter)

  • ES6引入了剩余参数(res parameter)
  • 可以将不定数量的参数放入到一个数组中
  • 如果最后一个参数是以...为前缀的,那么它会将剩余的参数放到该参数中,并且作为一个数组
  • 剩余参数必须放到最后一个,否则会报错
function foo(m,n,...arg) {
  console.log(m,n,arg)
}
foo(1,2,3,4,5,6)
//1 2 [ 3, 4, 5, 6 ]
剩余参数和arguments的区别:
  • 剩余参数只包含那些没有对应形参的实参,而arguments包含了传给函数的所有实参
  • arguments对象并不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作
  • arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,res参数是ES6提供的并且希望依次替代arguments的
 function bar(m,n,...arg) {
  console.log(arg)
  console.log(arguments)
}
bar(1,2,3,4,5,6,)
// [ 3, 4, 5, 6 ]
// [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5, '5': 6 }

箭头函数补充

  • 函数中没有this和arguments,会去其上级作用域中寻找
  • 没有显式原型对象,所以不能作为构造函数,使用new去创建对象
const foo = () => {};
console.log(foo.prototype); //undefined
const f = new foo(); //TypeError: foo is not a constructor

非常感谢王红元老师的深入JavaScript高级语法让我学习到很多 JavaScript 的知识

相关文章

  • 22.函数参数的默认值和剩余参数

    函数参数的默认值 1. ES5及之前给函数参数设置默认值 像0 '' null NaN 这些被转换为布尔值为f...

  • TypeScript05(函数扩展)

    函数的类型 函数的可选参数? 函数参数的默认值 接口定义函数 定义剩余参数 函数重载重载是方法名字相同,而参数不同...

  • 02|typescript常用实例

    一、定义索引数组 二、定义函数 函数参数可选 函数参数默认值 函数参数的剩余变量 函数的重载 三、ts中的类 类的...

  • es6基础知识3(函数拓展)

    title: es6基础知识3(函数拓展)tags: 参数默认值 剩余参数 箭头函数 categories: 前端...

  • 函数扩展

    1、参数给定默认值 2、剩余参数 3、函数传参数的同时可以解构 3.1数组解构 3.2对象解构

  • 1.0 C++远征:函数参数默认值、函数重载、内联函数

    C++远征 [TOC] 一、函数参数默认值 1.函数参数默认值的声明 2.函数参数默认值的定义 3.函数参数默认值...

  • ES6常用特性与一些注意点

    数组解构 对象解构 字符串扩展方法 函数参数:默认值与剩余参数 箭头函数 对象字面量增强 Object.assig...

  • ES6-函数参数的赋值

    函数参数的解构赋值: 函数参数解构赋值的默认值: 函数参数解构赋值的默认值undefined:

  • Python 34

    函数参数的灵活使用 1.默认值参数 2.列表参数 1)默认值参数 有参数的函数而言,必须在调用时制定参数 #给函数...

  • c++函数特性

    函数重载,参数默认值,内联函数 重载:函数名相同,参数列表不同,作用域相同。 参数默认值:参数默认值必须从最后开始...

网友评论

      本文标题:22.函数参数的默认值和剩余参数

      本文链接:https://www.haomeiwen.com/subject/kjaakrtx.html