全部 / 前端 / 技术 · 2022年7月16日 0

33 – 箭头函数和 new 、arguments 以及 super 关键字

原文地址:https://dev.to/bhagatparwinder/arrow-function-and-the-new-arguments-super-keyword-2d1l

我们之前已经学过了箭头函数以及它的 this 关键字的不同。

当涉及到 this 关键字的时候箭头函数会表现的不同,同时它也没有绑定的 argumentsnewsuper 关键字。

Arguments

arguments 对象是一个类数组使我们可以获取所有传递给函数的参数。

function addThreeNumbers(a, b, c) {
    console.log(arguments.length); // 3
    console.log(arguments[0]); // 4
    console.log(arguments[1]); // 17
    console.log(arguments[2]); // 22
    return a + b + c;
}

console.log(addThreeNumbers(4, 17, 22)); // 43

箭头函数的参数是对作用域参数的引用。

const bar = x => console.log(arguments);

console.log(bar()); // Uncaught ReferenceError: arguments is not defined

我们可以通过替代方法解决此问题,当你需要获取参数时,使用 rest 操作符。

const addThreeNumbers = (...args) => {
    console.log(args.length); // 3
    console.log(args[0]); // 4
    console.log(args[1]); // 17
    console.log(args[2]); // 22
    return args[0] + args[1] + args[2];
}

console.log(addThreeNumbers(4, 17, 22)); // 43

你可以通过解构使代码更简洁。

const addThreeNumbers = (...args) => {

    const [a, b, c] = args;

    console.log(args.length); // 3
    console.log(a); // 4
    console.log(b); // 17
    console.log(c); // 22

    return a + b + c;
}

console.log(addThreeNumbers(4, 17, 22)); // 43

New

箭头函数不能用作构造器,当和 new 一起使用时会报错。

const foo = () => { };
const bar = new foo(); // foo is not a constructor

箭头函数没有 Construct 内部方法。

Super

按照 ES 规范箭头函数不能与 super 关键字一起使用。

class Base {
    public foo = () => {
        console.log("Hello");
    }
}

class Child extends Base {
    public bar() {
        super.foo(); // Only public and protected methods of the base class are accessible via the 'super' keyword.
    };
}

然而,在这种场景下使用常规的函数。

class Base {
    public foo() {
        console.log("Hello");
    }
}

class Child extends Base {
    public bar() {
        super.foo();
    };
}

彩蛋

  • 箭头函数没有 prototype 属性
var Foo = () => { };
   console.log(Foo.prototype); // undefined
  • 箭头函数不能用作 generators ,因为它们没有 yield 关键字。