Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сделать из arguments массив (https://javascript.ru/forum/misc/47857-sdelat-iz-arguments-massiv.html)

Александр222 10.06.2014 15:28

Сделать из arguments массив
 
Подскажите пожалуйста, почему в данном примере .slice используется без круглых скобок?

function sayHi(){
	var args = [].slice.call(arguments);
	alert(args.join(':'));
};
sayHi(5,2,7);


В каком виде происходит обращение к .call, так [].slice или так .slice?

Почему не легче использовать такое решение

function sayHi(){
	var args = [];
	for(var i = 0; i < arguments.length; i++){
		args.push(arguments[i]);
	}
	alert(args.join(':'))
}
sayHi(5,2,7);

Erolast 10.06.2014 16:21

Цитата:

Подскажите пожалуйста, почему в данном примере .slice используется без круглых скобок?
Потому что ты ее не вызываешь. Ты вызываешь ее метод call, унаследованый через систему прототипов - http://javascript.ru/Function/call. В javascript функции - тоже объекты, да-да.

Цитата:

Почему не легче использовать такое решение
Легче? Мне кажется, что оно длиннее на две строки.

depp 10.06.2014 16:24

Александр222, а в контексте изучение чего вам был дан такой пример?

Александр222 10.06.2014 16:26

Erolast,
Если не брать во внимание величину кода, в чем еще недостатки?

Александр222 10.06.2014 16:26

depp,
http://learn.javascript.ru/this#%D0%...%D 0%B9-array

Erolast 10.06.2014 16:33

Цитата:

Erolast,
Если не брать во внимание величину кода, в чем еще недостатки?
Ну, вариант со slice будет немного быстрее, потому что функция нативная. Совсем немного. В остальном - да ни в чем. Первй вариант выигрывает именно в элегантности.

Александр222 10.06.2014 16:39

Erolast,
Но первый вариант мне до сих пор не совсем ясен.

Спасибо!

Erolast 10.06.2014 16:47

Что непонятно? Метод slice при использовании без аргументов просто возвращает исходный массив. Ты вызываешь его в контексте масивоподобного объекта arguments - вот и получается в итоге массив, соответствующий объекту arguments. Для того, чтобы добраться до функции slice, ты создал пустой массив, да.

Aetae 11.06.2014 00:52

Erolast, поправка: не исходный массив, а копию оного.


Александр222, таким образом можно применять нативные функции к любым объектам имеющим сходное строение.

Например массивоподобный объект:
var obj = {
    0: 'Hellow',
    1: 'world!',
    length: 2
}
alert(
    Array.prototype.join.call(obj, ' ')
)


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