Цитата:
|
Цитата:
Цитата:
|
В javascript было принято говорить by-val в отношении примитивов, и by-ref в отношении объектов. Это даже в доках было. Eсли ты видел на vingrad-e на меня с моим by-value смотрели как на марсианина. Потом постепенно начали исправлять по аналогии с java в онлайн-доках mdc, уточняя ситуацию с помощью разъяснений dev-ов.
By-value мне кажется очевидней, наиболее точным по отношению к стандарту, где есть только значения, где есть внутренние методы [[Get]], GetValue, промежуточный внутренний тип Reference Type, конкретизация переменных, где значения всегда копируются. И потом этот проще для понимания по сравнению с двойным случаем и уж тем более по сравнению с не используемым в быту by-sharing... Можете включать голосовалку, я за by-value... ;-) |
Цитата:
Цитата:
Цитата:
С другой стороны, технически, тогда обычное присвоение тоже создаёт копию ссылки и ничем не отличает от передачи в качестве параметра функции: var a = {x: 10}; var b = a; aRef = {baseObject: Global, propertyName: "a"}; // address: 0xFF bRef = {baseObject: Global, propertyName: "b"}; // address: 0xFF (скопировался) var a = {x: 20}; aRef = {baseObject: Global, propertyName: "a"}; // address: 0xFА (новый) bRef = {baseObject: Global, propertyName: "b"}; // address: 0xFF (старый) Вот в этом отношении говорить о значении (скопированном value адреса, ссылки) - да, конечно, правильно. И, повторю, тогда вообще нет разницы от присваивания и передачи в функции в качестве формального параметра (или есть, как думаешь?). Но, теоретическая evaluation strategy - остаётся by-sharing, как специально выделенная и обособленная от by-value и by-reference и именно по этому критерию. |
Ты просто на объекте замкнулся, представь, что объект не меняет свойств, почему сразу свойства дёргать внутри функции. Речь ведь о переменной и изменении её значения, а не о свойствах объекта. Если значением переменной не является объект, а только URL до объекта, то почему изменение свойств объекта (отражаемое везде) является аргументом в пользу by-sharing, и тем более by-ref. Меняем ведь не значение переменной. Это ж очевидно.
|
Zeroglif, на самом деле, мы говорим об одном и том же. Даже в статье об evaluation strategy из Википедии в подразделе by-value говорится о нашем случае:
Цитата:
Цитата:
by-value - это правильно (особенно, если учесть, что данную терминологию использует создатель языка). Но обособление by-sharing для этого случая (что означает ровно то же самое - копирование не целиком массивного объекта (как это было бы в Cи в случае by-value), а копирование лёгкой ссылки), мне кажется оправданным - чтобы не путать именно с by-value, когда передался бы объект-бегемот и менялся бы там внутри функции независимо. Хотя, с другой стороны, by-value в Си - это всего лишь одна из реализаций. Но, эта реализация (и её понятие by-value) появилась раньше JS. |
Хорошие цитаты. Особенно "but should not be understood as being call-by-reference". В общем, я сегодня почти поставил для себя в этом вопросе окончательную точку. Только вот разберусь с этим твоим call-by-sharing основательнее...
|
А я, пожалуй, найду время и напишу заметку по этому поводу, чтобы, опять же, ссылаться на неё, а не на вырванные из контекста ответы, если возникнет похожий вопрос. Мотивацией будет этот тред. В общем, будет "by-value" (a.lso k.nown a.s "by-sharing").
|
Dmitry A. Soshnikov,
Пиши, пиши, вот цитаты B.E. со ссылками: ...the property's value is a *reference* to the object, not the object itself. http://groups.google.com/group/mozil...ff6fa9deb204e1 JS is not C++. There is no deep or shallow copy on assignment. Object is a reference type, so v2 = v just copies the reference in v into v2, making both variables denote the same object. http://groups.google.com/group/netsc...dd2121f1fb8424 There is no copy of any object data. The only thing that's copied is a *reference* (a safe pointer, if you will) that uniquely addresses the object. http://groups.google.com/group/netsc...95f5eef93c1734 Just the reference - objects are reference types in JS, as in Java http://groups.google.com/group/netsc...79c0c9f86a6336 Что-то по JScript на винграде есть... liskov-y я прочитал (manual языка), да, это был бы подходящий термин, если бы прижился, там они чётко описывают, что значением переменной является reference на объект. Но раз не прижился, то пиарить не буду, только в качестве экскурса... меня полностью удовлетворяет то, как компактно и точно звучит первая цитата в твоём предыдущем сообщении. |
Цитата:
|
Часовой пояс GMT +3, время: 00:50. |