ES6系统学习之函数

箭头函数简化了ES5中的function函数声明语法。

箭头函数和this

() => {
    
     }

关于箭头函数的简写

  1. 如果有且仅有一个参数,( ) 可以不写;
    以下三种种写法等价:
function fn(num) {
    
    
        console.log(++num);
    }
let fn = (num) => {
    
    
        console.log(++num);
    }
let fn = num => {
    
    
        console.log(++num);
    }
  1. 如果有且仅有一个return语句,{ } 可以不写;
    以下四种写法等价:
function fn(num) {
    
    
        return ++num
    }
let fn = (num) => {
    
    
        return ++num
    }
let fn = num => {
    
    
        return ++num
    }
let fn = num => ++num

箭头函数中的this

ES5函数中的this

对于一个在对象方法中嵌套的内层函数而言,this会给我们带来很大的困扰,比如这样的一个对象:

var person = {
    
    
    name: "Jack",
    age: 21,
    fn: function () {
    
    
    	console.log(this === person)	//true	此时这里的this是person
        var self = this		// 使用一个临时变量储存一下最外层person,便于下面使用
        var addAge = function () {
    
    
            console.log(++self.age)		// 22 使用self临时变量可以获取到age
            console.log(this === window)	// true	这里的this是已经指向了window
        }
        addAge()
    }
}
person.fn()     // true, 22, true

首先我先解释一下上面的代码,person对象里有一个fn()方法,fn()函数内部又有一个addAge()函数,现在我想调用addAge()函数实现对personage的操作。
但问题出现了,我们在addAge()不能通过this来访问person,原因在第9行,此时的this指向window,所以我只能在与addAge()同一作用域的区域创建一个变量来储存person。
显然,ES5函数中关于this指向的总是会给我们带来许多麻烦。

ES6箭头函数中的this

依然是上面的对象中的方法又嵌套函数的结构,只不过这次我们的addAge()函数使用箭头函数来编写:

let person = {
    
    
    name: "Jack",
    age: 21,
    fn: function () {
    
    
        console.log(this === person)
        let self = this
        let addAge = () => {
    
    	// 箭头函数写法
            console.log(++this.age);	// this可以访问到age
            console.log(this === person)	// 此时的this指向person
        }
        addAge()
    }
}
person.fn()     // true, 22, true

可以看到,ES6中的箭头函数的确有所不同,并且更贴近我们写代码的思维,那么ES6箭头函数中的this指向究竟是怎么一回事呢?
事实上,箭头函数本身并没有this,其this全部来自函数的作用域链,取值就在函数作用域链中一层一层向上寻找。而且,箭头函数中this的指向取决于函数声明的地方,只要函数已经声明,this的指向不会再改变。(bind等强行改变this指向方式除外)

原生对象扩展

Array扩展

对于一个数组arr:

let arr = [84, 56, 99, 47, 19]

1.map 映射

一一对应,进去几个出来几个。比如我们想要将上面的数组进行简单的处理,大于60分的为及格,小于60分的就是不及格,这里我们就可以使用map映射的概念。

let pass = arr.map(item => item >= 60 ? "及格" : "不及格")

在这里插入图片描述

2.reduce 缩减

多对一,不论进去几个,只返回一个。对于上面的数组,假如我们现在想要算出这些数据的平均数,那么我们就可以用上reduce了,这里reduce接收三个参数,item,pre,index,这里的pre参数比较特殊,在第一次操作时它是初始值,之后都为上一操作的结果,我们就用它来储存前两项相加之和。

let avg = arr.reduce((item, pre, index) => {
    
    
        if (index == arr.length - 1)	// 当计算到最后一个数时,计算平均数
            return (pre + item) / arr.length
        else return pre + item
    })

3.filter 过滤

依次判断,确认是否保留。对于上面的数组,我们只保留奇数,那么我们可以这么做。
以下两种写法等价:

let odd = arr.filter(item => {
    
    
    if (item % 2 == 0)
        return false
    else return true
})
let odd = arr.filter(item => item % 2)

4.forEach 遍历

循环。现在我想在遍历这几个数据,让他们以此展示出来。

let show = arr.forEach((item, index) => console.log("第" + index + "个:" + item))

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43592084/article/details/110939303