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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Параметры by-value или by-reference, В самые основы JS 
:(
    Опции темы
Zeroglif
Дата 22.12.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Sardar @  22.12.2006,  04:26 Найти цитируемый пост)
Zeroglif, больше такого никому не говори

Вот все и будут путаться в трёх соснах (трёх учебниках). smile В javascript всё передаётся по значению (by-value). Дубль.

Спорить в личке смысла не вижу, ибо тема наиважнейшая, незачем прятаться, потом оторвём в отдельную ветку. Всего одна цитата из Client-Side Javascript Reference, которая должна тебя убеждать ибо источник суръёзный:

Цитата

All parameters are passed to functions by value; the value is passed to the function, but if the function changes the value of the parameter, this change is not reflected globally or in the calling function. However, if you pass an object as a parameter to a function and the function changes the object's properties, that change is visible outside the function...

Замечу, что говорится all parameters, не выделяя ни объекты, ни тем более строки, об остальных вообще молчу. Все! Объекты выделяются только в смысле прямого доступа к их свойствам. Это полностью соответствует принципам ECMAScript. Мы можем не знать точного механизма того или иного скриптового движка, но принципы он должен блюсти. Выделять объекты плюс строки в отдельный блок, который как-бы by-reference - только напускать тумана в мозг. Само собой, в javascript есть reference-type и мы работаем с ним непосредственно по ссылке, но это можно во всех книжках опускать, как понятное и само собой разумеющееся. Но работа со свойствами объекта и работа с переменными - две большие разницы. При работе с переменными совершенно не важно, значение какого типа в них хранится, при передаче мы или скопируем данные, или скопируем ссылку/указатель/адрес/бла-бла-бла на область памяти, где данные. Поэтому искать by-reference для переменных - совершенно бессмысленная затея, ECMAScript весь построен на by-value, жаргонно это одно из двух - или r-value, или  l-value...

Это сообщение отредактировал(а) Zeroglif - 22.12.2006, 15:10
PM MAIL WWW   Вверх
Nicholas_S
Дата 22.12.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не понятно, зачем что-то доказывать и цитировать, достаточно самому набросать пару примеров и посмотреть.


--------------------
...все в мире относительно
PM   Вверх
Zeroglif
Дата 22.12.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Nicholas_S @  22.12.2006,  15:44 Найти цитируемый пост)
Не понятно, зачем что-то доказывать и цитировать, достаточно самому набросать пару примеров и посмотреть.

Ты с кем согласен?

PM MAIL WWW   Вверх
AKS
Дата 22.12.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата

набросать пару примеров и посмотреть

"Два в одном флаконе":
Код

function A() { alert('A'); }

function B() { alert('B'); } 

function () { return arguments[0] = B; }(A)();     // 'A'

(function () { return arguments[0] = B; }(A))();   // 'B'

Zeroglif, скажите, я не ошибусь, если добавлю к тому, что Вы написали, следующее - считая, что мы получаем в аргументе ссылку на объект, на самом деле мы получаем ссылку на его значение?
PM MAIL   Вверх
Sardar
Дата 22.12.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Zeroglif @  22.12.2006,  14:08 Найти цитируемый пост)
Замечу, что говорится all parameters, не выделяя ни объекты, ни тем более строки, об остальных вообще молчу. Все!

Zeroglif, я предложил личку, только что бы не разводить пыль  smile 
ОК. Давай дадим ясное точное определение by-value и by-reference. Такие вещи как "передаёться by-value,  а потом все изменения рефлектируються обратно на исходный обьект" будем считать бредом сумасшедшего. Хотя есть такие интересные техники как call-by-restore, но это лишь для того, что бы защитить исполнение функции в разных тредах на одном обьекте (далее рождаеться ещё большая проблема - какие данные взять, а какие выбосить... потому такой приём редко где используеться).

У PHP4 можно встретить обьекты by-value, но там немного другая модель памяти, нацелена на реюзабельность данных если они не меняються, что в мире ООП "индейские боги акуеют от такого геморроя" (с) Oleg1973. В PHP5 заметили и поправили, заодно конкретно переделав работу с памятью. А вообще идея для однопоточного выполнения классная, выделять память только если обьект меняеться (copy-on-write) но это всё оффтоп.

by-value - передача копии обьекта функции. Любое изменение обьекта никогда не отразиться на исходном обьекте. 

by-reference - передача ссылки на обьект. В таком случае функция может "разыменовать" ссылку в обьект и изменить его. Все операции кроме присваивания работают одианоково, а вот по присваиванию ссылки деляться на:
  • указатели - возможно полное замещение указываемого обьекта на что то новое. Иногдарелализуют также функцию присваивания изменяющее сам указатель, что бы указывал на другой обьект.
  • ссылки - не возможно изменение указываемого обьекта, операция присваивания изменяет только ссылку.
Да, в by-reference реализациях такой код:
Код

var a = 90;
a = 85;

Порождает теоретически два обьекта, заставляя ссылку a указывать сначала на один, потом на другой. Если в окружении указателей нет, то все примитивы получаються immutable (не изменяемые). Другое дело что я могу хранить примитивы эффективней, для каждой ссылки сохранять значение не посредственно в ссылке (tagged values) -- но это лишь оптимизации и на сложные обьекты не распространяеться (они всегда по ссылке).

Вывод: в определении как передаються значения by-value или by-reference не может быть никаких however покрытое магией smile

По значению я в своем Trilobite Scripting Language (для веб-интерфейса одной железки) передавал строки и вообще все сложные значения не влезающие в tagged ссылку. А всё почему? Потому что примитивы immutable везде, раз они так себя ведут, то не важно какая там реалзиация на самом деле, главное что эффективно (в данном случае по памяти эффективно, её то было 2Мб всего).

Цитата(Zeroglif @  22.12.2006,  14:08 Найти цитируемый пост)
ECMAScript весь построен на by-value

А вот отсюда можно было бы подробней smile



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Zeroglif
Дата 22.12.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(AKS @  22.12.2006,  17:43 Найти цитируемый пост)
"Два в одном флаконе":

Смешной пример.  smile  smile 

Цитата(AKS @  22.12.2006,  17:43 Найти цитируемый пост)
мы получаем в аргументе ссылку на объект, на самом деле мы получаем ссылку на его значение

Значение объекта (не переменной) - это собственно сам объект. Аргументом передаётся значение переменной - ссылка/указатель/адрес/бла-бла-бла/называй-как-хош на область памяти, где живёт какой-нибудь огромный сложный непонятный объект-бегемот.

Цитата(Sardar @  22.12.2006,  18:27 Найти цитируемый пост)
Давай дадим ясное точное определение by-value и by-reference.

Если мы сами дадим - не считается, таких определений тьма, выбирай на вкус:

Цитата

by-value - аргумент передается по значению, т. е. при вызове процедуры будет создаваться локальная копия переменной с начальным передаваемым значением и изменения этой локальной переменной во время выполнения процедуры не отразятся на значении переменной, передавшей свое значение в процедуру при вызове.

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


И тому подобное другими словами. Я убеждён, что в попытке калькировать эту теорию на javascript, в доках/книжках изначально напустили тумана, объясняя возможность изменять свойства переданных объектов тем, что вот тут имеет место by-reference чистой воды. Намного проще и понятнее считать эту возможность чем-то вроде side-effect объектных типов, которые как и остальные типы передаются по значению. Я бы резюмировал теорию так - нужно различать типы-значения (value type) и ссылочные типы (reference type). Первые содержат данные, и переменная свяжется со значением в памяти. Вторые содержат ссылку, и переменная свяжется с "неким указателем" на область памяти (специально беру в кавычки, потому как наплевать, как это называть). К первым относятся примитивные типы, ко вторым - объектные (и я бы специально не стал выделять отдельно строки, т.к. с точки зрения immutable-принципа это не имеет смысла вообще, только если нужно кому-то знать для понимания отимизации в javascript). Таким образом, работая с переменными, мы всегда работаем по значению (с данными или "адресом"). Но работая непосредственно с объектом (с его свойствами), мы работаем по ссылке прямиком с объектом, с его значением.

Цитата(Sardar @  22.12.2006,  18:27 Найти цитируемый пост)
А вот отсюда можно было бы подробней

Внутренние методы [[Get]], GetValue, промежуточный внутренний тип Reference Type, конкретизация переменных, где значения всегда копируются.

Я тебе выдам на гора много-много ссылок, в обоснование своей позиции:

JavaScript:

"All parameters are passed to functions by value; the value is passed to the function, but if the function changes the value of the parameter, this change is not reflected globally or in the calling function".
http://developer.mozilla.org/en/docs/Core_...Guide:Functions


JScript:

"JScript passes all variables by value (not by reference), in accordance with the ECMA-262 specification".
http://support.microsoft.com/default.aspx?...kb;en-us;253282

"According to the ECMA-262 specification, Microsoft JScript passes all variables by value. Therefore, any changes that the callee makes to the variables are not reflected in the caller when it resumes execution".
http://support.microsoft.com/kb/269258/EN-US/

Peter Torr (Microsoft Scripting Dev):
"In COM terms, JScript passes everything by value - including all the object types... The fact that to pass an object by value means to pass its address, and from its address you can modify an objects properties, is merely an accidental side effect. You still can't change _the object pointed to by a parameter_ in JScript as you can in VB / C++ / etc".
http://groups.google.com/group/microsoft.p...d4456d111b343a3

Eric Lippert (Microsoft Scripting Dev):
"Both JScript and VBScript have reference types (ie, objects) but JScript does not have by-reference variables".
http://blogs.msdn.com/ericlippert/archive/...9/29/53117.aspx

Eric Lippert (Microsoft Scripting Dev):
"JScript has reference types -- all object types are reference types.  But JScript does not support variable references.  There is no way for one scope to change the value of a variable in another scope".
http://blogs.msdn.com/ericlippert/archive/...9/15/53005.aspx

Michael Harris (Microsoft.MVP.Scripting):
"JScript passes only by value. Even in JScript.Net, pass by ref is supported only for external method calls".
http://groups.google.com/group/microsoft.p...2fa6?hl=en&


Другое:

Учитывая, что конкретно для javascript подробных статей на эту тему нет, даю несколько ссылок на такие статьи для Java, ибо в javascript всё похоже.
http://club.shelek.com/viewart.php?id=87
http://www.javable.com/columns/robinson/letters/01/
http://javadude.com/articles/passbyvalue.htm - очень убедительно
http://www-128.ibm.com/developerworks/java...ry/j-passbyval/
http://faqs.org.ru/progr/web_lang/javafaq3.htm


PM MAIL WWW   Вверх
Sardar
Дата 22.12.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Zeroglif @  22.12.2006,  18:50 Найти цитируемый пост)
Смешной пример.

А что там смешного? smile
2AKS в последнем ты возвращаешь B, который затем сразу и выполняеться. "Деструктивного" присваивания аргументу не было.

Цитата(Zeroglif @  22.12.2006,  18:50 Найти цитируемый пост)
таких определений тьма, выбирай на вкус

Но заметь смысл то един, формулировка может только отличаться smile
Далее идёт то, о чём я и говорил. Передача аргуменов "по значению" используеться в книжках, т.к. так проще понять начинающему программисту. Обьясняя что есть не изменямые значения и ссылки, можно далеко уйти, да и может не совпадать с конкретной реализацией языка (оптимизации).

По ссылкам, ОК договорились smile
Опять же я расписывал термин ссылка как вообще ссылка (теоретически), в доке же идёт конкретая привязка к tagged values (когда для ссылки используеться тип, достаточно большой, что бы вместить примитивы или ссылку на обьект, таким образом каждая переменная имеет единый размер их можно выравнивать в памяти). Но это уже конкретная (наиболее часто встречаемая) реализация. В таком случае да, все значения передаються by-value, где ссылка на обьект (не на примитив) и есть то самое передаваемое value.
Но опять же помимо tagged values есть и другие методы хранения и передачи значений, потому более "сухой" термин ссылка ИМХО лучше.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
AKS
Дата 22.12.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Sardar, я знаю, где и что там возвращается. Этот пример к этой теме отношения не имеет. Он должен был остаться в той теме, т.к. он как раз из той серии...


M
Sardar
Так, парни, следим за выражениями. Поправил текст


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


 




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


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

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