Использование метода javascript slice() без аргументов

Сейчас я читаю этот плагин маскирования jquery, чтобы попытаться понять, как он работает, и во многих местах автор вызывает функцию slice(), передающую без аргументов к нему. Например, здесь переменная _buffer slice() d, а _buffer.slice() и _buffer, похоже, содержат одинаковые значения.

Есть ли причина для этого, или автор просто делает код более сложным, чем он должен быть?

 //functionality fn
 function unmaskedvalue($input, skipDatepickerCheck) {
     var input = $input[0];
     if (tests && (skipDatepickerCheck === true || !$input.hasClass('hasDatepicker'))) {
         var buffer = _buffer.slice();
         checkVal(input, buffer);
         return $.map(buffer, function(element, index) {
             return isMask(index) && element != getBufferElement(_buffer.slice(), index) ? element : null; }).join('');
    }
    else {
        return input._valueGet();
    }
}

Ответ 1

Метод .slice() создает (неглубокую) копию массива и принимает параметры, чтобы указать, какое подмножество исходного массива нужно скопировать. Вызов без аргументов просто копирует весь массив. То есть:

_buffer.slice();
// is equivalent to
_buffer.slice(0);
// also equivalent to
_buffer.slice(0, _buffer.length);

РЕДАКТИРОВАТЬ: Не обязателен ли начальный индекс? Да. И нет. Вроде. Ссылки на JavaScript (например, MDN) обычно говорят, что .slice() требуется хотя бы один аргумент - начальный индекс. Вызов .slice() без аргументов - это как сказать .slice(undefined). В ECMAScript Language Spec шаг 5 в алгоритме .slice() говорит: "Пусть relativeStart be ToInteger(start)". Если вы посмотрите на алгоритм абстрактной операции ToInteger(), который, в свою очередь, использует ToNumber(), вы увидите, что он заканчивает преобразование undefined в 0.

Тем не менее, в моем собственном коде я всегда говорил .slice(0), а не .slice() - мне кажется, что он более аккуратный.