Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> arguments - массив? 
:(
    Опции темы
Се ля ви
Дата 19.6.2008, 15:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



С некоторых пор меня интересует мотивация составителей стандарта ECMAScript, которые в отношении объекта "arguments" написали:
Цитата(ECMA-262)
10.1.8 Arguments Object
When control enters an execution context for function code, an arguments object is created and
initialised as follows:
  • The value of the internal [[Prototype]] property of the arguments object is the original Object prototype object, the one that is the initial value of Object.prototype (see 15.2.3.1).
  • A property is created with name callee and property attributes { DontEnum }. The initial value of this property is the Function object being executed. This allows anonymous functions to be recursive.
  • A property is created with name length and property attributes { DontEnum }. The initial value of this property is the number of actual parameter values supplied by the caller.
  • For each non-negative integer, arg, less than the value of the length property, a property is created with name ToString(arg) and property attributes { DontEnum }. The initial value of this property is the value of the corresponding actual parameter supplied by the caller. The first actual parameter value corresponds to arg = 0, the second to arg = 1, and so on. In the case when arg is less than the number of formal parameters for the Function object, this property shares its value with the corresponding property of the activation object. This means that changing this property changes the corresponding property of the activation object and vice versa.

Почему бы было не придать ему функциональность Array`а? Ведь и length есть и элементы по индексам перебираются... Почему, например:
Код
alert([1,2]);
 выведет "1, 2", а 
Код
alert(arguments);
 выведет "[Object object]"?
Зачем нужно было ставить всем параметрам атрибут { DontEnum }?  В итоге мы не можем пройтись по значениям атрибутов удобным способом с использованием конструкции for..in, а вынуждены писать обычный перебор со счётчиком...

В общем, сколько использую этот объект - столько мучаюсь. Интересует - хотя бы для чего это сделано?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Се ля ви
Дата 19.6.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



В общем, пока не придумал ничего лучшего, чем сделать так:
Код
/**
 * Function, needs for the 'arguments' object for converting it to the array
 * @return {Array} array consists arguments of function. 
 */
Object.prototype.toArray = function() {
    
    if (!this.length)
        throw new IllegelArgumentException('\'this\' object is not a \'arguments\' object.');
    
    var result = new Array();
    
    for (var i = 0; i < this.length; i++)
        result[i] = this[i];
    
    return result;
}


Соответсвенно, если нужно перенаправить вызов другой функции при том, что не хочется вдаваться в количество переданных параметров, можно теперь писать так:
Код
function fn(x,y){
    alert('x = ' + x + ', y = ' + y);
}

function fn1() {
    eval('fn(' + arguments.toArray() + ')');
}

//Проверяем:
fn1(1,2);//'x = 1, y = 2'



--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
dsCode
Дата 19.6.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Цитата(Се ля ви @  19.6.2008,  15:36 Найти цитируемый пост)
Интересует - хотя бы для чего это сделано? 

Точного объяснения никто (?) не видел =) Вообще, многие жалуются, почему arguments не массив, но толком сегодня объяснить этого не могут (были даже слухи, что NetScape обвинил в этом Microsoft =)), но я не знаю, насколько это правда)

Цитата(Се ля ви @  19.6.2008,  16:45 Найти цитируемый пост)
В общем, пока не придумал ничего лучшего

а можно slice'ом:

Код

function fn () {
  alert(Array.prototype.slice.call(arguments, 0, arguments.length));
}
 
fn(1,2,3);



Цитата(Се ля ви @  19.6.2008,  16:45 Найти цитируемый пост)
Object.prototype.toArray

ничего в Object.prototype расширять не надо. В Gecko и Opera потом будут лишние свойства даже у html'ых input'ов. Если уж хранить, то просто в Object.toArray = function(obj) { ... } (хотя вызов будет уже не столь красивым, конечно =)).

Это сообщение отредактировал(а) dsCode - 19.6.2008, 23:06


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Се ля ви
Дата 20.6.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(dsCode @  19.6.2008,  21:43 Найти цитируемый пост)
Цитата(Се ля ви @  19.6.2008,  16:45 Найти цитируемый пост)
В общем, пока не придумал ничего лучшего

а можно slice'ом:
Код
function fn () {
  alert(Array.prototype.slice.call(arguments, 0, arguments.length));
}
 
fn(1,2,3);


А я вот что нашёл:
Цитата(ECMA-232 @  15.3.4.3 Function.prototype.apply (thisArg, argArray), 3rd indent)
If argArray is null or undefined, the called function is passed no arguments. Otherwise, if argArray is neither an array nor an arguments object (see 10.1.8), a TypeError exception is thrown. If argArray is either an array or an arguments object, the function is passed the (ToUint32(argArray.length)) arguments argArray[0], argArray[1], …, argArray[ToUint32(argArray.length)–1].


Т.е. ещё удобней можно сделать так:
Код
function fn(x,y){
    alert('x = ' + x + ', y = ' + y);
}
function fn1() {
   fn.apply(null, arguments);
}
//Проверяем:
fn1(1,2);//'x = 1, y = 2'

smile
По крайней мере, они последовательны в своём стремлении не делать arguments массивом, так что элегантно вывернуться всё-таки можно. ;)


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
dsCode
Дата 20.6.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Цитата(Се ля ви @  20.6.2008,  11:38 Найти цитируемый пост)
fn(null, arguments);

так а это простой вызов функции, не эплай, поэтому не будет 'x = 1, y = 2' (будет x = null,  y = [Object])

Цитата(Се ля ви @  20.6.2008,  11:38 Найти цитируемый пост)
If argArray is either an array or an arguments

if это так, то будет передано argArray.length (количество) аргументов, и будут они доступны по индексам, начиная с 0. Т.е. если .apply(this, [1, 2]), то тогда arguments[0] == 1 (x),  arguments[1] == 2 (y).

Цитата(Се ля ви @  20.6.2008,  11:38 Найти цитируемый пост)
По крайней мере, они последовательны в своём стремлении не делать arguments массивом

а скорей всего просто тянут за собой наследие для обратной совместимости (и ладно бы, можно было пользоваться как объектом (например, arguments['a'], где a - имя формального параметра), так нет же - имитация обычного индексного массива).

Это сообщение отредактировал(а) dsCode - 20.6.2008, 12:45


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Се ля ви
Дата 20.6.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(dsCode @  20.6.2008,  12:40 Найти цитируемый пост)
а это простой вызов функции, не эплай

забыл вписать просто smile Исправил уже.


Цитата(dsCode @  20.6.2008,  12:40 Найти цитируемый пост)
Цитата(Се ля ви @  20.6.2008,  11:38 Найти цитируемый пост)
If argArray is either an array or an arguments object


if это так, то будет передано argArray.length (количество) аргументов, и будут они доступны по индексам, начиная с 0. Т.е. если .apply(this, [1, 2]), то тогда arguments[0] == 1 (x),  arguments[1] == 2 (y).

Да, главное здесь то, что arguments он принимает тоже. Мне собственно и нужно было организовать вызов одной функции из другой так, что бы не вникать сколько первой было передано параметров - просто передать всё, что есть.

Цитата(dsCode @  20.6.2008,  12:40 Найти цитируемый пост)
Цитата(Се ля ви @  20.6.2008,  11:38 Найти цитируемый пост)
По крайней мере, они последовательны в своём стремлении не делать arguments массивом


а скорей всего просто тянут за собой наследие для обратной совместимости (и ладно бы, можно было пользоваться как объектом (например, arguments['a'], где a - имя формального параметра), так нет же - имитация обычного индексного массива).

А у которых нет имён? ;) Для них всё равно пришлось бы индексы делать...

Да уж лучше бы тогда вообще к event object`у дали доступ...


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
dsCode
Дата 20.6.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Цитата(Се ля ви @  20.6.2008,  15:34 Найти цитируемый пост)
Да, главное здесь то, что arguments он принимает тоже.

Ну да, это стандартный прием вызова функции в нужном контексте с передачей arguments. Как частный вариант - ваш вызов с null, однако, если вызываемая функция работает с this, то передача null'a приведет к неправильным результатам.


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.