4.函数扩展

4.1.参数默认值

默认参数就是当用户没有传值的时候函数内部默认使用的值,在es5中我们通过逻辑运算符||来实现

function Fn(a, b) {
b = b || "nodeing";
return a + b
}
console.log(Fn("hello"))

这样写有一个缺点就是当我传入一个空字符串的时候,返回的结果并不是我想要的结果,正确的输出结果应该是:hello,但是因为空字符串会被转换成false, b = '' || "nodeing",所以最终输出的结果会是“hellonodeing“,因此,我们还需要去判断b有没有值

function Fn(a, b) {
if(typeof b === "undefined"){
b = "nodeing"
}
return a + b
}
console.log(Fn("hello"))

在es6中没有必要那么麻烦,可以在函数定义的时候给定默认值

function Fn(a, b = "nodeing"){
return "nodeing"
}

4.2.rest参数

fn(...参数名),这种形式的参数叫做rest参数,作用就是获取函数多余的参数,这样就不需要arguments对象了

function Fn(...arg){
for(var i = 0; i < arg.length; i++){
console.log(arg[i])
}
}
Fn(1,3,4,5,6)

使用rest参数和普通参数混用的时候需要注意的是一一对应关系

function Fn(a,b,...arg){
console.log(a,b,arg)
}
Fn(1,2,4,5,6)// 1传给a 2 传给b, 4、6、6传给arg,arg是一个数组

还应该注意的一点是rest参数必须放在最后

function Fn(...arg,a,b){}  //错误

4.3.箭头函数

在es6中,定义函数可以使用箭头(=>)的形式

let f = n => n*2

这种写法等价于

let f = function(n){
return n * 2
}

上面函数只是传入了一个参数,如果有多个参数的时候,需要写成这样

let f = (a, b) => a + b;

等价于

let f = function(a,b){return a + b}

如果函数体有多条语句的时候写成这样

let f = (a, b) => {
if(a>b){
console.log(a)
}else{
console.log(b)
}
}

如果没有参数的时候,括号不能省略

let f = () => console.log(1)
f() //f = => console.log(1) 如果写成这样会报错

注意事项:

(1)箭头函数没有自己的this,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

document.onclick = ()=>{
console.log(this) // window
};

上面代码中调用后面箭头函数的是document对象 但是指向的却是window,因为箭头函数在window环境下定义的


document.onclick = function () {
console.log(this) //document
let f = ()=>{
console.log(this) // document
};
f();
}

上面代码中箭头函数里的this指向的是document,原因是箭头函数是在事件处理函数function(){}中调用的,在onclick后面的匿名函数function中this是指向document的,所以内层的箭头函数里的this和外层函数的this都会指向document

再举一个例子:

document.onclick = ()=>{
console.log(this) //window
}; function fn() {
setInterval(()=>{console.log(this)}, 1000) //document
}
// fn()
document.onclick = fn;

上面代码中,setInterval中的匿名函数是在外层的fn环境下定义的,外层fn中的this是指向document,所有箭头函数中的this也指向document

(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

let F = ()=>{}

let f1 = new F()  //报错

(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

let f = ()=>{console.log(arguments)}

f()  //报错

(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数

视频教程地址:http://edu.nodeing.com/course/50

es6+最佳入门实践(4)的更多相关文章

  1. es6+最佳入门实践(14)

    14.模版字符串 模版字符串(template string)是增强版的字符串,定义一个模版字符串需要用到反引号 let s = `这是一个模版字符串` console.log(s) 14.1.模版字 ...

  2. es6+最佳入门实践(12)

    12.class基础用法和继承 12.1.class基础语法 在es5中,面向对象我们通常写成这样 function Person(name,age) { this.name = name; this ...

  3. es6+最佳入门实践(10)

    10.Generator 10.1.Generator是什么? Generator函数是ES6提供的一种异步编程解决方案.在它的内部封装了多个状态,因此,又可以理解为一种状态机,执行Generator ...

  4. es6+最佳入门实践(9)

    9.Iterator和for...of 9.1.Iterator是什么? Iterator又叫做迭代器,它是一种接口,为各种不同的数据结构提供统一的访问机制.这里说的接口可以形象的理解为USB接口,有 ...

  5. es6+最佳入门实践(8)

    8.Promise 8.1.什么是异步? 要理解异步,首先,从同步代码开始说 alert(1) alert(2) 像上面的代码,执行顺序是从上到下,先后弹出1和2,这种代码叫做同步代码 alert(0 ...

  6. es6+最佳入门实践(7)

    7.set和map数据结构 7.1.什么是set? Set就是集合,集合是由一组无序且唯一的项组成,在es6中新增了set这种数据结构,有点类似于数组,但是它的元素是唯一的,没有重复 let st = ...

  7. es6+最佳入门实践(6)

    6.Symbol用法 6.1.什么是Symbol? Symbol是es6中一种新增加的数据类型,它表示独一无二的值.es5中我们把数据类型分为基本数据类型(字符串.数字.布尔.undefined.nu ...

  8. es6+最佳入门实践(5)

    5.对象扩展 5.1.对象简写 在es5中,有这样一种写法 var name = "xiaoqiang"; var age = 12; var obj = { name : nam ...

  9. es6+最佳入门实践(3)

    3.数组扩展 3.1.扩展运算符 扩展运算符用三个点(...)表示,从字面上理解,它的功能就是把数组扩展开来,具体形式如下: let arr = [1, 2, 3]; console.log(...a ...

随机推荐

  1. Bootstrap3适配IE8浏览器的方法

    <!--[if lte IE 8]> <script src="js/respond.min.js"></script> <script ...

  2. 4,Flask 中的 request

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  3. SpringMVC---其它常用注解

    常用注解 PathVariable @RequestMapping注解中使用占位符的情况下,需要使用@PathVariable注解指定占位符参数.即指定占位符中的值与方法中哪一个参数进行匹配.如果方法 ...

  4. python的列表生成式和生成器

    1.列表生成式是Python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理,语法格式为: [exp for val in collection if co ...

  5. Web安全1&沙箱隔离

    1.web安全 Web安全的本质是信任问题 •由于信任,正常处理用户恶意的输入导致问题的产生 •非预期的输入(就是不是程序员预期的客户的输入) 安全是木桶原理,短的那块板决定的木桶世纪能装多少水,同样 ...

  6. mybatis异常:There is no getter for property named 'xxx' in 'xxx'

    在使用mybatis查询的时候出现了下面的异常: org.apache.ibatis.reflection.ReflectionException: There is no getter for pr ...

  7. 关于代码通过API操作阿里云RDS的巨坑

    由于项目原因,要通过API操作阿里云的数据库,于是简单研究了一下阿里云提供的相关文档,发现官方提供了.NET的SDK,而且还提供了github开源代码,这个要为阿里点赞! 于是到github上弄了一份 ...

  8. 如何在Apache中使用PHP处理PHP文件

    一.将PHP预处理器作为Apache的模块(插件) Apache软件自身的功能都是基于模块化管理的. 将PHP预处理器作为Apache的一个模块即可. 在apache/conf/httpd.conf的 ...

  9. Http状态码枚举(摘自 Microsoft 程序集 System.dll)

    // 摘要: // 包含为 HTTP 定义的状态代码的值. public enum HttpStatusCode { // 摘要: // 等效于 HTTP 状态 100. System.Net.Htt ...

  10. Jmeter beanshell preprocessor随机添加任意多个请求参数

    介绍下本次使用beanshell preprocessor的原因: 1.系统下可添加产品,一个产品可以有多个产品主题(比如:产品A(杭州三日游)拥有三个主题(研学.红学.夏令营)),我们在每次添加产品 ...