Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.02.2018, 23:37
Аспирант
Отправить личное сообщение для Sinevik Посмотреть профиль Найти все сообщения от Sinevik
 
Регистрация: 23.09.2017
Сообщений: 39

Метод slice?
Подскажите пожалуйста как работает этот участок кода

module.exports = function(module){
	return function(){

		var args = [module.filename].concat([].slice.call(arguments));
		console.log.apply(console, args);
	};
	
}


Вот этот кусок
[].slice.call(arguments)


Метод слайс копирует участок массива. А что тут происходит? пустой массив, потом зачем то вызов call?
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2018, 23:48
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

этот кусок делает из массивоподобного arguments объекта массив.
Ответить с цитированием
  #3 (permalink)  
Старый 13.02.2018, 23:49
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

[...arguments] в ES6 можно так
Ответить с цитированием
  #4 (permalink)  
Старый 14.02.2018, 00:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,501

j0hnik, в es6 можнонужно так: function(...args){...}

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 функция встроенная, то работать она должна гораздо быстрее чем ручная реализация выше.
__________________
29375, 35

Последний раз редактировалось Aetae, 14.02.2018 в 01:07.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не срабатывает метод slice() и join() Faab Общие вопросы Javascript 3 22.04.2012 17:10
Как в метод slice вместо числа подставить переменную leny Ваши сайты и скрипты 15 07.07.2011 23:06
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
Добавить свой метод к элементу alekciy Events/DOM/Window 6 16.02.2009 19:29