|
ОПЕРАТОР ПРИСВАИВАНИЯ ПОЛУЧАЕТ ЗНАЧЕНИЕ ССЫЛКИ?
var foo = { bar: function () { alert(this); } }; foo.bar(); // Reference, OK => foo (foo.bar)(); // Reference, OK => foo (foo.bar = foo.bar)(); // global? что происходит в последнем случае? Слева от скобок вызова находится не ССЫЛКА, а РЕАЛЬНОЕ ЗНАЧЕНИЕ ФУНКЦИИ. Но почему? Что поэтапно происходит? Как работает оператор присваивания? И что возвращают скобки " (foo.bar = foo.bar) " ? слева направа он работает или справа налево? Я думал что оператор смотрит что справа ссылка, достает ЗНАЧЕНИЕ обьекта из памяти по той ссылке. Генерирует новую ссылку относительно левого операнда, и кладет эту ссылку в левый операнд. И если все это дело взять в скобки, то скобки (которые не получают значение по ссылкам, а оставляют ссылки ссылками), то скобки должны вернуть левый операнд, а в нем лежит ссылка)), а у нас получается что возвращается не ссылка а РЕАЛЬНОЕ ЗНАЧЕНИЕ по ссылке. (в нашем случае это функция. (реальность значения, и то что оно не ссылка я определил по значению this, которое приняло значение глобального обьекта, а не базы ссылки, и такое происходит только если слева от скобок вызова реальное значение " VALUE() ", а не ссылка " REFERENCE() " ) ) а КАК НА САМОМ ДЕЛЕ работает оператор ровно что и как он достает и.т.п.)? И почему в данном случае мы получаем реальное значение функции, а не ссылку на неё? |
var foo = { bar: function () { alert(this); }, toString: function () { return "Hello, I'm foo!" } }; window.toString = function () { return "Hi, I'm a window" }; foo.bar(); // Reference, OK => foo (foo.bar)(); // Reference, OK => foo *!* (foo.bar, foo.bar)() */!* В первых двух случаях, как ни странно, выражения перед скобками вызова () нет. Плохо написал. Напишу согласно стандарту: 1. Оператор группировки (те самые круглые скобки) не вызывает вычисление значения. Таким образом, ссылка, обрамлённая скобками, остаётся ссылкой. 2. Все остальные операторы вызывают вычисление значения. Таким образом, для ссылки вычисляется объект, на который она указывает. При том, для (obj.fnc, obj.fnc) результатом будет значение obj.fnc, то есть fnc без указания базы, т.е. fnc "открепится" от obj. 3. При вызове функции в качестве this будет использована та самая база, которую мы потеряли при вычислении значения. |
Цитата:
2) и зачем вы заменили оператор присваивания запятой? О_О |
Цитата:
|
Цитата:
НО ЧТО ПРОИСХОДИТ ПОТОМ)? например в случае с РОВНО)? var q = 20 (q = q) // что вернут скобки? значение или ссылку? Левого операнда ИЛИ правого? можно расписать пошагово)? мыл оператор ровно смотрит что справа, потом достает, кладет и.т.п. Мне просто интересно ЧТО БУДЕТ ЯВЛЯТЬСЯ значением выражение в случае с ровно? |
Оператор присваивания, как и запятая, вычисляет значение правого аргумента, которое и возвращает.
Возвращено будет значение правого операнда. |
Цитата:
== <-- вот равно === <-- вот идентичность ==== <-- а вот....:D нет такого) |
Цитата:
в первом операнде после вычислений лежит не копия обьекта, а ссылка на обьект. В чем дело тогда, почему возвращается обьект? |
Цитата:
|
В твоем случае и во всех случаях в JavaScript оператор "=" - oператор присваивания. Этот оператор присваивает значение правого операнда левому.
А равно это "==" - оператор сравнения на равенство. Этот оператор сравнивает два операнда и возвращает Булев результат. И "===" - оператор тождества. Этот оператор сравнивает два операнда на равенство и возвращает Булев результат. И значения операндов, и их тип данных должны быть идентичны, чтобы оператор возвратил истину. Так что тебе все верно сказали, и твои обзывания неуместны. |
Часовой пояс GMT +3, время: 12:35. |
|