译者:前端小智
作者:Tania Rascia
来源:flatlogic.com

点赞再看,微信搜索**【大迁世界】,B站关注【前端小智】**这个没有大厂背景,但有着一股向上积极心态人。本文 GitHub https://github.com/qq449245884/xiaozhi 上已经收录,文章的已分类,也整理了很多我的文档,和教程资料。

最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。

github 地址:https://github.com/qq449245884/vue-okr-tree

我是小智,今天,我们来讲讲默认参数。

在 ES6 中,JS引入了默认函数参数。如果未向函数调用提供实参,则允许开发人员用默认值初始化函数。以这种方式初始化函数参数将使函数更容易阅读,更不易出错,并为函数提供默认行为。这也帮助我们避免由于传入未定义的参数和解构不存在的对象而产生的错误。

在本文中,我们将学习一下形参和实参之间的区别,了解如何在函数中使用默认形参,了解支持默认形参的其他方法,并了解哪些类型的值和表达式可以用作默认形参。

实参和形参

在解释默认函数参数之前,重要的是要知道参数的默认值是什么。所以我们先回顾函数中实参和形参之间的区别。

在下面的代码中,我们创建一个函数,该函数返回一个给定数的立方:

function cube(x) {return x * x * x
}

此示例中的x变量是一个参数-传递给函数的命名变量,参数必须始终包含在变量中。接着,我们来调用一下这个函数:

cube(10) // 1000

在这种情况下,10是一个参数—调用时传递给函数的值。 通常,值也可以用变量,如:

const number = 10cube(number) // 1000

如果没有将参数传递该函数,函数将隐式地使用undefined作为默认值:

cube() // NaN

在本例中,cube()试图计算undefined * undefined * undefined的值,结果是NaN

这种自动的行为有时会造成问题。在某些情况下,我们希望参数具有一个值,即使没有向函数传递参数。这就是默认参数特性派上用场的地方。

默认参数语法

如果没有默认参数,我们就需要显式检查undefined的值才能设置默认值,如以下示例所示:

function cube(x) {if (typeof x === 'undefined') {x = 5}return x * x * x
}cube()

相反,使用默认参数可以用更少的代码实现相同的目标。 可以通过使用等式赋值运算符(=)为多维数据集中的参数设置默认值,如下所示:

function cube(x = 5) {return x * x * x
}

现在,在不带参数的情况下调用多维数据集函数时,它将为x5并返回计算而不是NaN

传递参数时,它仍将按预期运行,而忽略默认值:

cube(2)  // 8

需要注意的一个地方,默认参数值还将覆盖作为函数的参数传递的undefined ,如下所示:

cube(undefined)  // 125

这里是使用默认参数 5 来计算的,显示的传递 undefined 会被忽略。

默认参数数据类型

任何原始值或对象都可以用作默认参数值。 首先,使用 number, string, boolean,objectarraynull 作为默认值来设置参数。

const defaultNumber = (number = 42) => console.log(number)
const defaultString = (string = 'Shark') => console.log(string)
const defaultBoolean = (boolean = true) => console.log(boolean)
const defaultObject = (object = { id: 7 }) => console.log(object)
const defaultArray = (array = [1, 2, 3]) => console.log(array)
const defaultNull = (nullValue = null) => console.log(nullValue)

在不带参数的情况下调用这些函数时,它们都将使用默认值:

defaultNumber()  // 42
defaultString()  // "Shark"
defaultBoolean() // true
defaultObject()  // {id: 7}
defaultArray()   // (3) [1, 2, 3]
defaultNull()    // null

注意,在默认参数中创建的任何对象都将在每次调用函数时创建。默认参数的一个常见用例是使用这种行为从对象中获取值。如果我们试图从一个不存在的对象中解构或访问一个值,它将抛出一个错误。但是,如果默认参数是一个空对象,那么它只会给出undefined 的值,而不会抛出错误。

function settings(options = {}) {const { theme, debug } = options// Do something with settings
}

这样避免因解构不存在的对象而导致的错误。

现在我们已经看到了默认参数如何与不同的数据类型一起工作,下面我们来看看多个默认参数如何协同工作。

使用多个默认参数

首先,声明一个带有多个默认参数的sum()函数

function sum(a = 1, b = 2) {return a + b
}sum() // 3

此外,参数中使用的值可以在任何后续的默认参数中使用,从左到右。例如,这个createUser函数创建了一个用户对象userObj作为第三个参数,函数本身所做的就是返回userObj和前两个参数

function createUser(name, rank, userObj = { name, rank }) {return userObj
}// Create user
const user = createUser('前端小智', '前端开发')console.log(user) // {name: "前端小智", rank: "前端开发"}

通常建议将所有默认参数放在参数列表的末尾,以便可以轻松保留可选值。 如果首先使用默认参数,则必须显式传递undefined才能使用默认值。

function defaultFirst(a = 1, b) {return a + b
}

当调用这个函数时,必须调用带有两个参数的defaultFirst():

efaultFirst(undefined, 2)  // 3

实战中的事例,下面是一个函数,它的作用是创建一个DOM元素,并添加一个文本标签和类(如果存在的话)。

function createNewElement(tag, text, classNames = []) {const el = document.createElement(tag)el.textContent = textclassNames.forEach((className) => {el.classList.add(className)})return el
}const greeting = createNewElement('p', 'Hello!', ['greeting', 'active'])

此时 greeting 的值为

<p class="greeting active">Hello!</p>

如果将classNames数组保留在函数调用之外,则该数组仍将起作用。

const greeting2 = createNewElement('p', 'Hello!')console.log(greeting2) // p>Hello!</p>

函数调用作为默认参数

除了原始类型和对象外,调用函数的结果可以用作默认参数。

在下面代码中,创建一个返回随机数的函数,然后将结果用作多维数据集函数中的默认参数值:

function getRandomNumber() {return Math.floor(Math.random() * 10)
}function cube(x = getRandomNumber()) {return x * x * x
}

现在每次调用 cube 结果可能都会不一样:

cube()  // 512
cube()  // 64

在以下示例中,将一个随机数分配给x,该随机数用作我们创建函数中的参数。 然后,y参数将计算数字的立方根,并检查xy是否相等:

function doesXEqualY(x = getRandomNumber(), y = Math.cbrt(cube(x))) {return x === y
}doesXEqualY() // true

默认参数甚至可以是函数定义,如本例所示,它将参数定义为内部函数并返回参数的函数调用:

function outer(parameter = function inner() {return 100}
) {return parameter()
}// Invoke outer function
outer() // 100

总结

在本文中,我们了解了什么是默认函数参数以及如何使用它们。现在,我们可以使用默认参数来帮助保持函数的整洁和易于阅读。还可以预先将空对象和数组分配给参数,以便在处理从对象中检索值或遍历数组等情况时减少复杂性和代码行数。

我是小智 ,我们下期见!


编辑中可能存在的bug没法实时知道,事后为了解决这些bug,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

原文:https://www.taniarascia.com/default-parameters-javascript/

交流

文章每周持续更新,可以微信搜索 【大迁世界 】 第一时间阅读,回复 【福利】 有多份前端视频等着你,本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,欢迎Star。

深入 JavaScript 中的默认参数!相关推荐

  1. python默认参数举例_Python中的默认参数实例分析

    本文研究的主要是Python中的默认参数的相关内容,具体如下. 熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进 ...

  2. [转载] 详细介绍Python函数中的默认参数

    参考链接: Python函数中的默认参数 详细介绍Python函数中的默认参数 import datetime as dt def log_time(message, time=None): if t ...

  3. python默认参数举例_Python中的默认参数详解

    文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对 ...

  4. 站长在线Python精讲:在Python函数中的默认参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的默认参数详解>.本文的主要内容有:默认参数的概念和默认参数的示例.默认参数不能设置可变对象. 目录 1 ...

  5. 参数 中_理解JavaScript中函数的参数

    1,arguments JavaScript的函数的参数(arguments)在函数体的内部表现为一个类似数组的对象.就是它拥有数组的方法,却不是Array的实例. 例1 我们直接打印出argumen ...

  6. 用类来实现输入输出时间,定义多个类对象分别输入输出各对象的时间(时:分:秒),使用函数,数据成员不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数

    //个人留着复习用 #include using namespace std; class Time {public: int hour; //类 int minute; int sec; }; in ...

  7. python默认参数的传参方式_如何跳过在Python方法中提供默认参数

    我从Python boto2 library中调用这个方法: boto.emr.step.StreamingStep(name, mapper, reducer=None, combiner=None ...

  8. Javascript中Window.open参数详解

    关于Window.open的参数小结(参书改编) 先看一个例子: [javascipt:]window.open("Webpage.asp?",Derek,"height ...

  9. JavaScript中childNodes默认格式问题

    先看一段代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

最新文章

  1. OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)
  2. Palo Alto 亚太区首席安全官:未来中国五大安全问题突出...
  3. 机器人学习--MATLAB官网关于机器人方面的资料
  4. SpringBoot 2.x 整合Mybatis一:基础
  5. mysql租车管理系统_基于java实现租车管理系统
  6. OO_2019_第一单元总结——表达式求导
  7. 新版linux系统主机最低配置,Linux系统初始配置标准化
  8. 面试准备——springboot相关
  9. 数据库sql中commit的重要性
  10. EdrawMax Crack,跨平台图表软件
  11. jQuery入门 jQuery入门第一天 1. jQuery入门
  12. java毕业设计便利店库存管理Mybatis+系统+数据库+调试部署
  13. 如何修改计算机mac,超简单的电脑mac地址查看和修改方法
  14. 虚拟主机服务需要备案吗?推荐使用哪种进行建站?
  15. logit回归怎么看显著性_请教用SPSS做两分类逻辑回归时自变量的显著性问题
  16. 安防无战事:一场10213亿元的误会
  17. 单核到多核的转变无疑是沧桑巨变
  18. 谷歌地球基本简介及趣味功能
  19. mysql y m d h i_php时间问题?mysql数据库的时间格式(Y-M-D H:I:S) 在PHP页面想这样显示(Y-M-D) (apos;.#36;rows[apos;ndate...
  20. Express文件表单解析中间件 Multer简介

热门文章

  1. OTN / SONET / SDH
  2. 16比9尺寸是多少厘米_16比9(16比9分辨率大全)
  3. 古墓丽影:崛起 PC版今日发售
  4. Python爬虫:7_BeautifulSoup4图片爬取
  5. 爬取新浪微博热搜排行
  6. SpringSecurity实现数据库认证
  7. 知识笔记 - sekiro RPC框架的安装与简单使用
  8. 实现微信小程序上传视频的注意事项
  9. 编程累了进来听听音乐
  10. 23种设计模式彩图-设计模式之禅