Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.11.2013, 12:55
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

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

foo('a', 'b', 'c', 'd', "1", "odin");
почему вобще этот пример работает ???
каким боком функция slice превращает объект в индекс и делает срез всех аргументов из объекта arguments ??
такое чуство будто slice работает на подобие .call в котором можно передавать контекст для функции.
Поясните пожалуйста эту чернейшую магию ! ) спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 05.11.2013, 13:39
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Ошибка.

Цитата:
error: 'Array.slice' is not a function
Ответить с цитированием
  #3 (permalink)  
Старый 05.11.2013, 13:43
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

в FF работает кстати, а в Google Chrome нет, странно вобще.
Ответить с цитированием
  #4 (permalink)  
Старый 05.11.2013, 13:46
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

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

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

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

Последний раз редактировалось ksa, 05.11.2013 в 13:52.
Ответить с цитированием
  #5 (permalink)  
Старый 05.11.2013, 13:51
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Сообщение от ksa Посмотреть сообщение
Это даже читать страшно...
мне также было страшно читать пример который я привел, я лишь надеялся на то, что тут найдутся отважные хардкодеры повидавшие кучу подобной js магии.
Ответить с цитированием
  #6 (permalink)  
Старый 05.11.2013, 14:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

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

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

И все "массивные" методы к arguments неприменимы...
Ответить с цитированием
  #7 (permalink)  
Старый 05.11.2013, 14:11
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

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

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('-'));
Ответить с цитированием
  #8 (permalink)  
Старый 05.11.2013, 14:20
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Сообщение от ksa Посмотреть сообщение
Тебя обманули и код твой не рабочий...
в FF 24 этот код рабочий ! в хроме нет, у тебя видимо старый FF.
Сообщение от ksa Посмотреть сообщение
И все "массивные" методы к arguments неприменимы...
массивные методы к arguments здесь как раз не применяютя, slice применяется к пустому массиву но как будто с контекстом для arguments.
Тоесть вызов работает как если бы было
var args = [].slice.call(arguments);
Ответить с цитированием
  #9 (permalink)  
Старый 05.11.2013, 14:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

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

Сообщение от Arramis
в FF 24 этот код рабочий
Наслаждайся частным случаем...

Сообщение от Arramis
Тоесть вызов работает как если бы было
var args = [].slice.call(arguments);
Это все твои фантазии...
Ответить с цитированием
  #10 (permalink)  
Старый 05.11.2013, 14:24
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

В самом низу написано, что метод эквивалентен 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")
__________________
.
Ответить с цитированием
Ответ



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

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