文档章节

函数的扩展

thomaslwq
 thomaslwq
发布于 2017/02/22 22:15
字数 981
阅读 13
收藏 0
点赞 0
评论 0
函数的默认值
ES6允许为函数设置默认值
function world(x,y="world"){
  console.log(x,y)
}
参数变量是默认声明的,不能用let或者const再次声明
function foo(x=5){
  let x = 1;
  const x = 2;
}
一个容易忽视的地方就是,如果参数默认值是变量,那就不是传值,而是每次都重新计算默认值表达式的值
let x = 99
function foo(p=x+1){
  console.log(p);
}
foo();//100
x = 100;
foo();//101

与解构赋值默认值结合使用
function foo(x,y=5){
 console.log(x,y);
}
foo({});//undefined,5
foo({x:1})//1,5
foo({x:1,y:2})//1,2
foo()//TypeError,can't read property 'x' of undefined

如果传入函数的值是undefined,结果触发了默认值,null没有这个效果

function foo(x=5,y=5){
  console.log(x,y);
}
foo(undefined,null);

函数的length属性

指定了默认值之后,函数的length属性,将返回没有指定默认值的参数个数,也就是说,指定了默认值之后,length属性将会失真。

 (function(a){}).length //1
 (function(a){c=5}).length //0
 (function(a,b,c=5)).length //2

如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的属性了
(function(a=0,b,c)(){}).length //0
(function(a,b=1,c)(){}).length //1

作用域

一旦设置了函数的默认值,函数进行声明初始化时,参数就会形成一个单独的作用域(context).等初始化结束之后,这个作用域就会消失。
var x = 1;
function f(x,y=x){
  console.log(y);
}
f(2) //2

利用参数默认值,可以指定某一参数不得省略

function throwIfmissing(){
  throw new Error("Missing parameter");
}
function foo(mustBeProvided = throwIfmissing){
  return mustBeProvided;
}
foo();
//Error: missing parameter

rest 参数

形式为"...变量名"

function add(...values){

  let sum = 0;
  for(var val of values){
    sum + = val;

  }
  return sum;
}

add(3,4,5);//12

拓展运算符

拓展运算符是三个点(...).它就好比rest的逆运算,将一个数组转为用逗号分隔的参数序列
console.log(...[1,2,3])
//1,2,3

替代数组的apply方法

由于拓展运算符可以展开数组,所以不需要apply方法,将数组转化为函数的参数了。

ES5写法

function f(a,b,c){

}
var args = [1,2,3]
f.apply(null,args)

ES6写法

f(...args);

拓展运算符的应用

合并数组
var arr1 = ['a','b']
var arr2 = ['c','d']
[...arr1,...arr2]
与解构赋值结合
[a,...rest] = list
如果将扩展运算符用于数组赋值,那么只能放在参数的最后一位,否则就会报错
const [...fisrt,second] = [1,2,3,4] //报错
const [first,...middle,third] = [1,2,3,4,5]

函数返回值

Javascript的函数只能返回一个值,如果需要返回多个值,只能返回数组或者对象。扩展运算符提供了解决这个问题的一种变通方法。

 var dataFields = readDateFields(database);
 var d = new Date(...dateField);

 

 字符串

[...'Hello']
//["H","e","l","l","o"]

实现了Iterator接口的对象,都可以用扩展运算符转为真正的数组。

箭头函数

ES6允许使用箭头定义函数
var f = v=>v
等同于
var f = function(v){
  return v;
}

箭头函数的注意点:
1 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
2 不可以当作构造函数,也就是,不可以使用new命令,否则会抛出一个错误
3 不可以使用arguments参数,因为不存在,如果需要,可以使用Rest参数代替
4 不可以使用yield命令,因此箭头函数不能用做Generator函数

绑定this

ES7提案,Babel转码器已经支持,函数绑定运算符是两个并排的冒号,双冒号左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,作为上下文环境,绑定到右边的函数上。

foo:bar
等同于
bar.bind(foo)

尾调用优化

某个函数的最后一步是调用另一个函数

 

function f(x){
 return g(x);
}

 

© 著作权归作者所有

共有 人打赏支持
thomaslwq
粉丝 6
博文 35
码字总数 31692
作品 0
广州
高级程序员
Kotlin类和对象(四)——扩展和data类

扩展 与C#和Gosu类似,Kotlin提供既不使用继承也不使用任何类型的设计模式(如装饰者模式)扩展新功能类的能力。这种通过特殊声明的操作叫做扩展。Kotlin支持函数扩展和属性扩展。 扩展函数 ...

flueky
2017/10/23
0
0
你还在把Java当成Android官方开发语言吗?Kotlin了解一下!

导语:2017年Google IO大会宣布使用Kotlin作为Android的官方开发语言,相比较与典型的面相对象的JAVA语言,Kotlin作为一种新式的函数式编程语言,也有人称之为Android平台的Swift语言。 本文...

腾讯云加社区
06/21
0
0
Kotlin学习笔记(五) 扩展函数 扩展属性

扩展函数和属性可以定义在对应的类中和kotlin文件中; 1.扩展函数 1.扩展函数可以由对象直接调用,在扩展函数中,用this指代调用对象; 2.当类成员函数与扩展函数签名一样时,优先执行成员函数. 2...

JackyRiver
06/06
0
0
CUDA学习(七十七)

扩展的Lambda类型特征: 编译器提供类型特征来在编译时检测扩展lambda表达式的闭包类型(closure types): :如果'type'是为扩展的创建的闭包类,那么该特征为true,否则为false。 :如果'...

night李
02/24
0
0
拼音输入法API开发解密---lua篇

当今的拼音输入法太多,如搜狗拼音输入法,以及谷歌拼音输入法,都增加了输入法扩展功能,虽然竞争很激烈,但从技术上来说差不多。 先介绍下谷歌输入法扩展API功能。 开始----lua开发 为了帮...

crossmix
2015/12/14
142
2
Introduce Local Extension (引入本地扩展)

Summary: 你需要为服务类提供一些额外函数,但你无法修改这个类。建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。 Motivation: 在使用一些无法修改源码的类时,...

忆瑶
2013/05/13
0
0
那些年,我们看不懂的那些Kotlin标准函数

Kotlin标准库中提供了一套用于常用操作的函数。最近,在我的Kotlin交流群中有人再次问到了关于这些函数的用法。今天,让我们花一点时间,一起看一下这些函数的用法。 Ready go >>> 注:这里所...

欧阳锋
04/26
0
0
Kotlin常见问题和代码

记录Kotlin常见问题和代码。 6. 代替智能转换(20171122) 在网上看到一个问题是说有两个方法,同名不同参数 然后现在有个变量是未定类型,在使用方法的时候,然后他是这样写的,问说如何智能...

叫我旺仔
2017/07/25
0
0
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数

原创文章,欢迎转载。转载请注明:关东升的博客 扩展类型的时候,也可以添加新的构造函数。值类型与引用类型扩展有所区别。值类型包括了除类以外的其他类型,主要是枚举类型和结构体类型。 ...

智捷课堂
2015/12/23
23
0
转向Kotlin——枚举类和扩展

枚举类 Kotlin中的枚举类和Java中的枚举类型非常相似,具有类的特性。一般将可枚举的同类型的一组值作为枚举类定义。 基本用法 Kotlin中,枚举类型以类的形式存在,因此叫做枚举类,如下是实...

Android机动车
04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统

expect脚本同步文件 更改权限 执行脚本 查看执行结果 expect eof需要加上,作用是等脚本命令执行完再进行退出 expect脚本指定host和要同步的文件 更改权限,执行脚本 构建文件分发系统 需求背...

Zhouliang6
33分钟前
1
0
Hive应用:外部分区表

Hive应用:外部分区表 介绍 Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示...

星汉
44分钟前
2
0
点击Enter登录

1. 效果 2. 实现过程(记得引入jq文件) //6.回车事件 登录 $(function() { document.onkeydown = function(event) { var e = event || window.event || arguments.callee.caller.arguments......

Lucky_Me
49分钟前
1
0
点击菜单内容切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .mao{ ......

南桥北木
今天
1
0
OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
今天
548
6
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
8
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
1
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
16
0
idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
2
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部