Укороченный синтаксис тратит память? - PullRequest
3 голосов
/ 16 сентября 2010

Я обнаружил, что аккуратный способ преобразования объекта, подобного массиву (например, NodeList, Arguments), в реальный массив заключается в использовании:

Array.prototype.slice.call(...);

Затем я подумал, как сократить этот синтаксис:

[].slice.call(...);

Будет ли последний метод тратить время и / или память, создавая новый массив при каждом вызове?Должен ли я избежать этого синтаксиса в приложениях, требующих сложности, или механизмы JavaScript оптимизируют это?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Я думаю, что обозначения [], вероятно, следует избегать. Если вы хотите сэкономить место, почему бы просто не сделать:

// Once in JS
var slice = Array.prototype.slice.call;

// Many places in JS
slice(...);
1 голос
/ 16 сентября 2010

Лично я не вижу большой проблемы с использованием вашего сокращенного синтаксиса.Любое влияние на производительность будет минимальным (и некоторые движки будут оптимизироваться соответствующим образом), поэтому оно сводится к личным предпочтениям.Есть несколько альтернатив, доступных для вас, хотя.Например, вы можете использовать ECMAScript 5-е издание Function.prototype.bind, чтобы сократить его до чего угодно:

var sl = Function.prototype.call.bind(Array.prototype.slice);
var myArr = sl([1, 2, 3], 1);
//-> [ 2, 3 ]

И, конечно, bind может быть реализовано в неподдерживаемых браузерах .

В поддерживаемых браузерах / средах вы также можете использовать Array.from или оператор распространения для достижения тех же результатов:

// Array.from works with any iterable or array-like object
var myArr = Array.from(arrayLike);

// Spread operator works only with iterables:
var myArr = [ ...arrayLike ];

Если вы используете транспортер, такой как Traceur или Babel, он уже поддерживается.

...