默认参数

ES5中使用参数默认值

function add(a, b) {
    a = a || 10;
    b = b || 20;
	return a + b;
}
add(); // 30

ES6中使用参数默认值

function add(a = 10, b = 20) {
    return a + b;
}
add(); // 30

function add1(a, b = 20) {
    return a + b;
}
add1(30); // 50

默认表达式也可以是一个函数

function add(a, b = getVal(5)) {
    return a + b;
}
function getVal(val) {
    return val + 5
}
add(10); // 20

剩余参数

ES5中参数的使用

function pick(obj) {
    let result = Object.create(null);
    for(let i = 1; i < arguments.length; i++) {
        result[arguments[i]] = obj[arguments[i]]
    }
    return result;
}
let book = {
    title: '11111',
    author: 'xx,
    year: 2020
}
let bookData = pick(book, 'title', 'author'); // {title: "对线技巧", author: "乌兹"}

ES6中的剩余参数

由三个点和一个紧跟的具名参数指定...keys,解决了arguments的问题

function pick(obj, ...keys) {
    console.log(keys); 	// ['title', 'author'], 将多个独立的参数合并到一个数组中
}
let bookData = pick(book, 'title', 'author');

扩展运算符

将一个数组分割,并将各个项作为分离的参数

const arr = [10, 20, 30, 50];
// ES5
console.log(Math.max.apply(null, arr)); // 50
// ES6
console.log(Math.max(...arr)); // 50

箭头函数

基本用法

let add = function(a,b) {
    return a + b;
}
// ==> 箭头函数
let add = (a, b) => {
    return a + b;
}
// -------------------------
let addOne = val => val + 1;
addOne(1); // 2
// ------------------------
let getObj = id => ({id: id, name: "小马哥"})
// ------------------------
let getFn = () => {
    return () => {
        console.log(111);
    }
}
let fn = getFn();
fn(); // 111

箭头函数的this指向

es5中this的指向取决于调用该函数的上下文对象。

箭头函数没有this指向,箭头函数内部this的指向只能通过查找作用域链确定,一旦使用箭头函数,当前就不存在作用域

let pageHandle = {
    id: 123,
    init: function() {
        document.addEventListener('click', function() {
            // this 指向document
            this.doSomeThings(event.type); // doSomeThings is not defined
        }, false)
    },
    // ES5 使用bind修改this指向
    init1: function() {
        document.addEventListener('click', function() {
            // this 指向pageHandle
            this.doSomeThings(event.type); 
        }.bind(this), false)
    },
    // ES6 箭头函数
    init2: function() {
        document.addEventListener('click', event => {
            // this 指向pageHandle
            this.doSomeThings(event.type); 
        }, false)
    },
    init3: () => { 
        document.addEventListener('click', event => {
            // this 将指向pageHandle外层作用域
            this.doSomeThings(event.type); 
        }, false)
    },
    doSomeThings: function(type) {
        console.log(`事件类型:${type}, 当前id:${this.id}`);
    }
}

注意事项

  • 箭头函数内部没有arguments

    let getVal = (a, b) => {
        console.log(arguments); // not defined
        return a+b;
    }
  • 箭头函数不能使用new关键字实例化对象

    let Person = () => {};
    // function函数 是一个对象,但箭头函数不是对象
    let p = new Person(); 	// Person is not a constructor

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

ES6拓展的对象功能 上一篇
Vue-Router 下一篇