Разница между () => и _ => и (_) => в JS ES6 - PullRequest
6 голосов
/ 02 мая 2019

Я заметил, что когда я хочу написать жирную стрелку, функцию " => " я могу сделать _=>, ()=> или (_)=> и мой код функционирует одинаково (по крайней мере, для моих случаев использования)

Есть ли реальная разница между ними? Если да, , какой мне следует использовать? Я использовал ()=> большую часть времени, но потом однажды я увидел чей-то код использует _=>, и я подумал, что он выглядит круто, поэтому я тоже начал его использовать.

Я видел эту среднюю статью https://medium.freecodecamp.org/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26, где автор заявляет, что вы можете использовать _=> или ()=>, но не указывает, есть ли разница.

Ответы [ 3 ]

11 голосов
/ 02 мая 2019

Общая форма функции жирной стрелки:

(parameter-list) => function-body

Если у вас нет параметров, используйте пару пустых скобок:

() => {}

Если выесть один параметр это:

(x) => {}

Так как _ является допустимым идентификатором в JavaScript, вы можете сделать:

(_) => {}

Теперь применяется специальное правило: если у вас есть только один параметр, вы можете пропустить скобки, так что вы получите:

_ => {}

Обратите внимание, что это допустимо, только если у вас есть один параметр, то есть для двух вы всегда должны указатькруглые скобки:

(x, y) => {}

Теперь, с правой стороны, если вся ваша функция состоит только из одного оператора с return, такого как

x => { return x; }

, вы можете опуститьфигурные скобки и return:

x => x

По крайней мере, это так, если справа вы не пытаетесь вернуть объект, который будет выглядеть так (этот код не будет работать!):

x => { value: x }

Причина, по которой это не работает, заключается в том, что JavaScript не может отличить это от фуnction body, в котором также используются фигурные скобки, поэтому теперь вам нужно заключить его в скобки:

x => ({ value: x })

Я думаю, что это почти все, что вам нужно знать о синтаксисе функций жирной стрелки.

4 голосов
/ 02 мая 2019

Вы не должны использовать что-то только потому, что это выглядит круто.

_ часто используется, чтобы сообщить линтеру (или читателю), что вы не используете определенный аргумент специально.

Так что если у вас есть обратный вызов с двумя аргументами и вы используете только второй, вы должны написать (_, arg) => console.log(arg), потому что если вы напишите (foo, arg) => console.log(arg), то линтер будет жаловаться на то, что foo не используется.

И некоторые API могут вести себя по-разному в зависимости от количества аргументов, которые имеет обратный вызов (промежуточное ПО expressjs является примером для этого), поэтому, если API проверяет свойство length обратного вызова, вам может потребоватьсяиспользовать заполнитель, такой как _.

var cb1 = _ => {};
var cb2 = () => {};

console.log(cb1.length)
console.log(cb2.length)
1 голос
/ 02 мая 2019

Функции стрелок принимают любое количество параметров, как и «обычные» функции. Если параметры отсутствуют, это обозначается () => {}, аналогично function() {}. Если у вас есть ровно один параметр, скобки могут быть опущены. Это приводит к синтаксису, подобному _ => {}, как вы заметили, - он идентичен (_) => {}, поскольку подчеркивание является допустимым идентификатором (точно так же, как foo).

Разница во времени выполнения в вашей конкретной ситуации, по-видимому, отсутствует, поскольку вы (предположительно) не передаете никаких параметров, в этом случае _ не определено. Вы можете легко проверить это:

const foo = _ => console.log(_);
foo(5); // logs 5
foo(); // logs undefined

Это не значит, что вы должны сделать это, просто сейчас это не имеет значения. Если вы добавите параметр позже, это может привести к хаосу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...