Можно ли использовать именованную переменную в качестве нескольких аргументов? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть простой код:

 context.drawImage(image, 0, 0);

Мне было интересно, возможно ли это, используя что-то вроде функций распространения ES6 (редактировать: синтаксис распространения, а не оператора распространения), чтобы устранить магические числа и сделать код более явным:

 const TOP_LEFT = [0, 0]
 context.drawImage(image, ...[TOP_LEFT]);

Можно ли использовать переменную в качестве нескольких аргументов при вызове функции?

1 Ответ

0 голосов
/ 29 июня 2018

Да & mdash; Точно так же, как вы, но без [] вокруг, когда вы его используете:

context.drawImage(image, ...TOP_LEFT);

Live Пример:

function drawImage(image, x, y) {
  console.log("image = " + image);
  console.log("x = " + x);
  console.log("y = " + y);
}

const TOP_LEFT = [0, 0]
drawImage("the image", ...[TOP_LEFT]);

Теперь вы, возможно, не захотите делать это в тесном цикле из тысяч итераций, потому что теоретически и, как указано, ...TOP_LEFT включает в себя вызов функции в массиве для создания объекта итератора, а затем повторный вызов метода на том итераторе, который каждый раз создает объект результата и получает свойство из этого объекта результата. Но все это потенциально может быть подвергнуто оптимизации, и в любом случае мы обычно хотим не беспокоиться о производительности до тех пор, пока не будет решена конкретная проблема с производительностью.

Вы можете помочь оптимизатору, заморозив ваш массив:

const TOP_LEFT = Object.freeze([0, 0]);

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


Примечание: ... не оператор, и не может быть. Оператор, как и функция, имеет одно значение результата. Spread (и остальные) - это первичный синтаксис, а не операторы, такие как операторы for, объявления функций и инициализаторы объектов.

...