function test(x) { x = x || '默认值' // 使用||设置默认值 console.log(x) } test() // '默认值'
但这样作有个很是明显的缺陷
若是x的值为null/+0或-0/NaN/''/false
中的一个,x都会被设置为默认值,但咱们的本意是在不传值的时候才设置为默认值javascript
所以有了第二种处理方式java
ES5其实原本就有函数默认参数,
只不过这个默认参数只能是undefined,没法设置
function test(x) { console.log(x) } test() // undefined
因此咱们只要对传入的值 是否为undefined进行判断就能够实现自由设置默认参数了
function test(x) { if(!(Object.prototype.toString.call(x) === "[object Undefined]")) { console.log('默认值') } else { console.log(x) } } test() // '默认值'
其实很是简单,直接在参数后面加个 = 号就行啦,看栗子吧
function test(x = '默认值') { console.log(x) } test() // '默认值'
若是要给多个参数赋值,就像下面这样写
function test(x = '默认值1',y = '默认值2') { console.log(x,y) } test() // 默认值1 默认值2
但这本质上其实仍是对undefined
作判断,是1.2小节
的语法糖
function f(x = 1) { console.log(x) } f(undefined) // 1
参数默认值是不记录值的,每次都会 从新计算参数默认表达式的值
// 阮一峰老师 ES6深刻浅出 的例子 let x = 99; function foo(p = x + 1) { console.log(p); } foo() // 100 x = 100; foo() // 101 而不是 100
// mdn的例子 function append(value, array = []) { array.push(value); return array; } append(1); //[1] append(2); //[2] 而不是 [1, 2]
有同窗必定会有疑问,这不是废话吗?其实否则,好比
Python
的参数默认值不必定是惰性求值,好比下面这个例子
>>> def f1(data=[]): ... data.append(1) ... return data ... >>> f1() [1] >>> f1() [1, 1] >>> f1() [1, 1, 1]
函数剩余参数的英文为 ——Functions Rest Parameters
,通常咱们剩余参数为rest参数
注:概念摘自阮一峰老师的《ECMAScript 6 入门》
ES6 引入 rest 参数(形式为...变量名
),用于获取函数的多余参数,这样就不须要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
从上面的概念中,咱们至少能够知道以下三个信息python
...
+变量
。这个变量的数据类型是数组,用来存放多余的参数多余参数
首先咱们要搞清楚什么是多余参数
数组
function sum(x, y) { return x + y } sum(1, 2, '多余1', '多余2', '多余3') // 3
从上面的例子咱们能够看到,sum函数接受两个参数的传递,可是用户传递了五个参数,后面的三个参数即便传递也是没法被sum函数使用,显得有些多余
app
这里的多余并非无用的意思,而是相对于被使用到了的参数显得多余而已函数
那么,若是咱们也想对这些多余参数进行处理的话就须要使用rest参数
了prototype
// 用rest参数改写以后 function sum(x, y, ...paraArr) { console.log(paraArr) return x + y } sum(1, 2, '多余1', '多余2', '多余3') // ["多余1", "多余2", "多余3"] 3
既然rest参数是arguments的语法糖,那么咱们只要搞清楚以往arguments的应用场景是什么,那么天然就懂得如何使用rest参数了。rest
下面看一个使用arguments的例子code
// 建立一个sum函数,实现以下功能 // sum() // 0 // sum(1) // 1 // sum(2,10,2) // 14 // sum(0,0,200,1) // 201 // sum(1,10,3,2,100) // 116 function sum() { let total = 0 for (let i = 0; i < arguments.length; i++) { total += arguments[i] } return total }
从上面的例子咱们能够发现其最大的特色是参数个数不肯定
,因此若是遇到函数参数个数不肯定
的状况,就要优先考虑使用rest参数
,并且因为rest参数
是真数组,你用起来会比arguments舒服太多
下面是用rest参数进行改写对象
// 建立一个sum函数,实现以下功能 // sum() // 0 // sum(1) // 1 // sum(2,10,2) // 14 // sum(0,0,200,1) // 201 // sum(1,10,3,2,100) // 116 function sum(...paraArr) { let total = 0 paraArr.forEach(e => total += e) return total }
arguments由于能获取到全部参数因此仍是有它的不可替代性的,可是其伪数组的特性实在有点恶心,下面教你们三种方法转换,第一种是ES5的方法,剩下两种是ES6的方法
function sum() { let arr1 = Array.prototype.slice.call(arguments) let arr2 = Array.from(arguments) let arr3 = [...arguments] // 这个是展开语法【spread syntax】 我会在ES6指北的下一章讲解,敬请关注~~ }