Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   черная магия (https://javascript.ru/forum/misc/42669-chernaya-magiya.html)

Arramis 05.11.2013 12:55

черная магия
 
Привет всем, ей богу, не понимаю как в данном примере работает slice:
function foo() {
	var args = Array.slice(arguments);
	alert( args.join('-') );
}

foo('a', 'b', 'c', 'd', "1", "odin");
почему вобще этот пример работает ???
каким боком функция slice превращает объект в индекс и делает срез всех аргументов из объекта arguments ??
такое чуство будто slice работает на подобие .call в котором можно передавать контекст для функции.
Поясните пожалуйста эту чернейшую магию ! ) спасибо

ruslan_mart 05.11.2013 13:39

Ошибка.

Цитата:

error: 'Array.slice' is not a function

Arramis 05.11.2013 13:43

в FF работает кстати, а в Google Chrome нет, странно вобще.

ksa 05.11.2013 13:46

Цитата:

Сообщение от Arramis (Сообщение 279598)
function foo() {
	var args = Array.slice(arguments);
	alert( args.join('-') );
}

foo('a', 'b', 'c', 'd', "1", "odin");

каким боком функция slice превращает объект в индекс и делает срез всех аргументов из объекта arguments ??
такое чуство будто slice работает на подобие .call в котором можно передавать контекст для функции.

Это даже читать страшно... :blink:

Arramis 05.11.2013 13:51

Цитата:

Сообщение от ksa (Сообщение 279610)
Это даже читать страшно... :blink:

мне также было страшно читать пример который я привел, я лишь надеялся на то, что тут найдутся отважные хардкодеры повидавшие кучу подобной js магии.:-?

ksa 05.11.2013 14:08

Arramis, нет там никакой "магии"... :D
Тебя обманули и код твой не рабочий...

Цитата:

Несмотря на доступ по индексу и наличие свойства length, arguments не является массивом, т.е не принадлежит типу Array.
http://javascript.ru/arguments

И все "массивные" методы к arguments неприменимы...

ksa 05.11.2013 14:11

Некая иллюстрация...

var a=[1,2,3];
alert('a - '+typeof a);
var b=a.slice(0);
alert(b.join('-'));
//
var o={1:1, 2:2, 3:3, length:3};
alert('o - '+typeof o);
alert('o.length = '+o.length);
// далее будет ошибка
var c=o.slice(0);
alert(c.join('-'));

Arramis 05.11.2013 14:20

Цитата:

Сообщение от ksa (Сообщение 279618)
Тебя обманули и код твой не рабочий...

в FF 24 этот код рабочий ! в хроме нет, у тебя видимо старый FF.
Цитата:

Сообщение от ksa (Сообщение 279618)
И все "массивные" методы к arguments неприменимы...

массивные методы к arguments здесь как раз не применяютя, slice применяется к пустому массиву но как будто с контекстом для arguments.
Тоесть вызов работает как если бы было
var args = [].slice.call(arguments);

ksa 05.11.2013 14:23

Цитата:

Сообщение от Arramis
у тебя видимо старый FF.

У меня вообще Опера... :D

Цитата:

Сообщение от Arramis
в FF 24 этот код рабочий

Наслаждайся частным случаем... :D

Цитата:

Сообщение от Arramis
Тоесть вызов работает как если бы было
var args = [].slice.call(arguments);

Это все твои фантазии... ;)

Skipp 05.11.2013 14:24

В самом низу написано, что метод эквивалентен Array.prototype.slice.call, что бы не было путаницы.
https://developer.mozilla.org/en-US/...ts/Array/slice
Так работает везде:
(function() {
	alert( Array.prototype.slice.call(arguments).join('-') );
})('a', 'b', 'c', 'd', "1", "odin")


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