ES6 函数的扩展1---参数,属性,rest, 扩展运算符

1 . 函数参数的默认值

  • 在 ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
function log(x,y){
   y=y||'你好';
  console.log(x,y)
}
log('妹子')  //妹子你好

严格上来说有还需要判断参数的类型,如果比如上面函数,y传入的为false,那么参数就不起作用了。

  • ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
function log(x,y='你好'){
  console.log(x,y)
}
log('妹子')  //妹子,你好
  • 配合解构使用
function log({x,y=5}){
  console.log(x,y)
}
log2({x:1,y:2})  // 1,2

2 . 函数length属性

  • 在函数指定默认值之后,它的length属性将返回没有指定默认值的参数个数。
  • 函数参数指定默认值后,length属性将是真。
function log1(x,y){
}
console.log(log1.length)  //2
function log2(x,y='你好'){
}
console.log(log2.length)  //1

之所以会失真,我们要了解函数的length存在含义,它的数值表示函数预期传入的参数个数,当参数指定默认值的时候,函数的length将失真。

2 . 作用域

  • 如果参数默认值是变量,则该变量的作用域和其他变量的作用域规则是一样的,即优先当前作用域,然后往上至全局作用域寻找。
var x = 2;
function log(x,y = x){
 console.log(x,y)
}
log(1) //1 1

上面调用log函数时,由于函数作用域的变量x已经生成,且赋值为1,所以y等于函数内部x=1,而不是全局作用域的x变量。

3 . 应用

  • 利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。
function ThrowIfMissing(){
   throw new Error('Missing parameter');
}
function foo(mustBeProvided = ThrowIfMissing()){
  return mustBeProvided 
}
foo()   //Uncaught Error: Missing parameter

上面的函数,如果运行foo不传参,会直接触发ThrowIfMissing(),抛出异常。

  • 除了默认赋值抛出异常函数,我们还可以赋值undefined,表明这个参数可以省略。
function foo(mustBeProvided = undefine){...}

4. rest参数

  • rest(形式为...参数名),用于获取函数的多余参数,这样就不需要用arguments对象了。
  • rest参数搭配的变量是一个数组,该变量将多余的参数放入其中。
function add(...values){
  let sum = 0;
  for( var val of values){
    sum+ = val;
   }
   return sum 
}
add(1,2,3)  //6
function foo (...values){ console.log(values) }
foo(1,2,3) //  [1, 2, 3]

rest解决了arguments对象的局限性,因为rest就是数组的实例,某些需求下各种方便。

5. 扩展运算符

  • 扩展运算符(spread)是三个点(...),好比是rest的逆运算,将一个数组转为用逗号风格的参数序列。
console.log(...[ 1, 2, 3 ])  //1, 2, 3
console.log(0,...[ 1, 2, 3 ], 4, 5)  //0, 1,  2, 3, 4, 5
  • 扩展运算符(...)替代了ES5常用的apply操作。
//ES5
function add(x, y, z){
  return x+y+z;
}
var arr = [1,2,3]
add.apply(null,arr)
//ES6
add(...arr)
  • 应用
  1. 合并数组
//ES5
[1,2].concat(arr);
[1,2].concat( arr1, arr2, arr3 )
//ES6
[1, 2, ...arr]
[1,2, ...arr1, ...arr2, ...arr3 ]
  1. 与解构赋值结合
//ES5
a = arr[0],rest = arr.slice(1);
//ES6
[a,...rest] = arr;

...运算符只能放在参数的最后一位,放在其他地方会报错。

  • 字符串
[...'hello'] // ["h", "e", "l", "l", "o"]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352