Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   создать из arguments настоящий массив (https://javascript.ru/forum/misc/27734-sozdat-iz-arguments-nastoyashhijj-massiv.html)

bot87 23.04.2012 09:41

создать из arguments настоящий массив
 
function someTest(a,b) {
           var args = Array.prototype.slice.call(arguments);
            args.shift()//удаляю аргумент
for(i=0;i<arguments.length;i++){
alert(arguments[i])	
}

    }

someTest(1,2)

Я ж удалил 1 аргумент, почему он остался?

Pavel M. 23.04.2012 09:55

в цикле надо args использовать, а не arguments
function someTest(a,b) {
 var args = Array.prototype.slice.call(arguments);
  args.shift()//удаляю аргумент
  for(i=0;i<args.length;i++){
    alert(args[i])
  }
 
}
 
someTest(1,2);

nerv_ 23.04.2012 09:58

var args = [].slice.call( arguments );

Превращение arguments в настоящий Array

ппц... Вы хоть темы называйте правильно

devote 23.04.2012 11:56

Цитата:

Сообщение от nerv_
var args = [].slice.call( arguments );

Не лучший вариант, как известно slice вызывает конструктор создания массива, который потом накапливает тем что есть в контексте, в вашем же случае происходит двойной вызов конструктора, один из них просто ненужный:

[] - вызывает конструктор (тот самый ненужный вызов)
.slice - ищет прототип slice в прототипах массива, то-есть глубокий поиск, начиная от экземпляра созданного массива
call(...) - снова вызывает конструктор для наполнения его тем что есть в контексте.

Пример данный Pavel M., намного производительный, так как не требует вызова лишних методов и поиска прототипа рекурсией.
var args = Array.prototype.slice.call(arguments);

Octane 23.04.2012 13:04

И такую штуку теперь лучше в отдельный метод Array.from оформлять.

nerv_ 28.04.2012 09:47

Цитата:

Сообщение от Maxmaxmахimus
Утиная типизация.

При чем тут это? devote все правильно сказал (как мне кажется)
Цитата:

Смысл утиной типизации — в проверке методов и свойств, безотносительно типа объекта.
«Утиная» типизация

Kolyaj 28.04.2012 10:02

Цитата:

Сообщение от devote
Не лучший вариант, как известно slice вызывает конструктор создания массива, который потом накапливает тем что есть в контексте, в вашем же случае происходит двойной вызов конструктора, один из них просто ненужный:

Вы действительно думаете, что это хоть как-то повлияет на скорость работы скрипта? Одно обращение к DOM сведёт на нет сотни таких оптимизаций.

devote 28.04.2012 10:09

Цитата:

Сообщение от Kolyaj
Вы действительно думаете, что это хоть как-то повлияет на скорость работы скрипта? Одно обращение к DOM сведёт на нет сотни таких оптимизаций.

Да мне собственно все-равно кто и как использует, я лишь описал внутреннее поведение конструкции. А что вам использовать то или иное решать вам. При вычислении каких либо данных, вариант заслуживает рассмотрения. Для работы остального вариант лишь показывает лишний раз что любой код/конструкция имеет право на жизнь. Пусть она хоть и немного но быстрее.

nerv_ 28.04.2012 12:39

Каждый по своему прав. Но, согласитесь, зачем делать больше (нагружать комп/браузер), если можно меньше, при том же результате или при еще более выигрышном. Это из серии "===" (идентично) работает быстрее, чем "==" (равно), т.к. последнее производит преобразования типов [насколько мне известно]. Над этим не надо загоняться, просто иметь ввиду )

Kolyaj 28.04.2012 13:02

Цитата:

Сообщение от nerv_
зачем делать больше (нагружать комп/браузер), если можно меньше

Зачем нагружать сеть, гонять по ней больше байтов, если можно меньше?


Часовой пояс GMT +3, время: 23:09.