原文地址:https://dev.to/bhagatparwinder/arrow-function-and-the-new-arguments-super-keyword-2d1l
我们之前已经学过了箭头函数以及它的 this 关键字的不同。
当涉及到 this
关键字的时候箭头函数会表现的不同,同时它也没有绑定的 arguments
、new
和 super
关键字。
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
关键字。