Метод slice?
Подскажите пожалуйста как работает этот участок кода
module.exports = function(module){ return function(){ var args = [module.filename].concat([].slice.call(arguments)); console.log.apply(console, args); }; } Вот этот кусок [].slice.call(arguments) Метод слайс копирует участок массива. А что тут происходит? пустой массив, потом зачем то вызов call? |
этот кусок делает из массивоподобного arguments объекта массив.
|
[...arguments] в ES6 можно так
|
j0hnik, в es6
Sinevik, [].slice.call(arguments) arguments - массивоподобный объект, содержащий все переданные в функцию параметры, независимо от их количества. массивоподобный - имеющий числовые ключи и свойство length, например {"0": "a", "1": "b", "length": 0}. [] - создание пустого массива .slice - ссылка на функцию slice и прототипа массивов, по сути то же самое что Array.prototype.slice, с той разницей что вызывается от имени созданного выше массива(т.е. внутренний this равен []). .call - вызов функции с переопределением this на указанный первым параметром. В данном случае в качестве this в функцию массива slice передаётся arguments. Поскольку slice можно представить (очень условно) таким кодом function slice(start, end){ var array = this; //в качестве исходного ?массива берём this var length = array.length; //получаем его длину var result = []; //создаём пустой массив для результатов start |= 0; //приводим к int if(typeof end === 'undefined') //если конец не указан end = length; //то равен длине else { //иначе end |= 0; //приводим к int if(end === 0 || -end >= length) //если конец перед нулевым элементом return result; //сразу возвращаем пустой массив if(end < 0) //если конец меньше нуля end += length; //вычитаем из длины if(end > length) //если конец больше длины end = length; //то равен длине } if(start < 0) //если начало меньше нуля start = -start > length ? 0 : start + length; //если начало перед нулевым элементом то начинаем с нуля иначе вычитаем из длины while(start < end) result.push( //пока начало меньше конца добавляем в результирующий массив array[start++] //значение по индексу начала и передвигаем начало на 1 впердё ); return result //возвращаем результирующий массив }то ничего не мешает использовать эту функцию для получения из массивоподобных объектов настоящих массивов. А поскольку slice функция встроенная, то работать она должна гораздо быстрее чем ручная реализация выше. |
Часовой пояс GMT +3, время: 10:45. |