Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ОПЕРАТОР ПРИСВАИВАНИЯ ПОЛУЧАЕТ ЗНАЧЕНИЕ ССЫЛКИ? (https://javascript.ru/forum/misc/23888-operator-prisvaivaniya-poluchaet-znachenie-ssylki.html)

B@rmaley.e><e 11.12.2011 13:33

Цитата:

Сообщение от nerv_
this будет window. Или я не прав?

Нет. Стандарт гласит:
Цитата:

Значение this передаётся вызывающим. Если значение this, переданное вызывающим, не является объектом (заметим, что null - не объект), то значением this является глобальный объект.
Цитата:

Сообщение от nerv_
Строки сравниваются по значению.

Избыточное замечание. Строки — это тоже примитивы.
String.prototype.amIObject = "Nope";
var str = "string";
str.amIObject = "Yes!";
alert(str.amIObject)

nerv_ 11.12.2011 14:13

B@rmaley.e><e, спасибо, что тратите на меня время :) Перешел по ссылке "стандарт", прочитал. Хочу попросить Вас перейти по этой window, прочитать самое первое предложение, а после еще раз ответить на мой вопрос)

Цитата:

Сообщение от B@rmaley.e><e
Избыточное замечание. Строки — это тоже примитивы.

Java Script - Подробное руководство, 3.15.2. Копирование и передача строк, Флэнаган предполагает, что строки передаются по ссылке, но сравниваются по значению.
Ваш пример на данный момент понять не могу. Про prototype только читаю)))

p.s.: я не строю из себя умника. Просто хочу понять, как оно устроено :yes:

B@rmaley.e><e 11.12.2011 14:27

Цитата:

Сообщение от nerv_
прочитать самое первое предложение, а после еще раз ответить на мой вопрос

Так что Вам не нравится?
Цитата:

Сообщение от monolithed
вызов фунции происходит уже в Window, т.к. this будет null

При вызове функции в качестве this будет передан null. При вызове [[Call]] this будет определён согласно этому.

С тем, что window — глобальный объект и именно на него будет указывать this в этом случае, никто не спорит. Но вместе с тем, во внутренней механике стандарта используется именно null. window не берётся каким-либо магическим образом из окруженая. И, кстати, в strict mode ES5 this не становится глобальным объектом в случае
var a = function () {
  alert(this);
};

a();
a.call(null);
(a = a)();
"use strict";
var a = function () {
  alert(this);
};

a();
a.call(null);
(a = a)();
Цитата:

Сообщение от nerv_
Флэнаган предполагает, что строки передаются по ссылке, но сравниваются по значению.

Элементарные типы.
Фленеган же зачем-то погружается в особенности реализации, которые не зависят от стандарта и могут сильно варьироваться.
Строки наверняка реализованы с механизмом copy-on-write.

Livanderiaamarum 11.12.2011 17:38

Цитата:

Сообщение от monolithed (Сообщение 141912)
Livanderiaamarum,

var foo = function() {
     return this;
};

var bar = {
  baz: function () {
    return this;
  }
};

alert([
    foo(), //Window
    foo.prototype.constructor(), //Object 
    bar.baz(), //Object  
    (bar.baz)(), //Object 
    (bar.baz = bar.baz)(), //Window
    (bar.baz = bar.baz()), //Object
     bar.baz  //Object 
].join('\n'));

Рассмотрим подробнее, что происходит с:
(bar.baz = bar.baz)();
В этом случае, согласно спецификации вызывается метод GetValue().
Это значит, что тип Reference заменяется Function и вызов фунции происходит уже в Window, т.к. this будет null



Это я ЗНАЮ)! ну почему НИ КТО не читает внимательно текст топика)!!!!! Вот в чем вопрос, почему reference меняется на VALUE? От куда именно скобки берут ТО что возвращать мне?? Слева от ровно или справа? Слева от ровно по окончанию дествия лежит ссылка. справа тоже лежит ссылка. Значит скобки берут значение И НЕ СЛЕВА ОТ РОВНО и НЕ СПРАВА ОТ РОВНО, тогда откуда)?? или может происходит следущее??

(bar.baz = bar.baz)()


тут яваскрипт начинает вычислять то что в скобках.
и получает следущее

(bar.baz /*и тут ссылка*/ = bar.baz /*тут ссылка*/ )()



Простое присваивание ( = )
Значение нетерминала ВыражениеПрисваивания : ЛевостороннееВыражение = ВыражениеПрисваивания вычисляется по следующей схеме:
1. Вычислить значение ЛевостороннегоВыражения.
2. Вычислить значение ВыраженияПрисваивания.
3. Вызвать ПолучитьЗначение(Результа (2)).
4. Вызвать ЗаписатьЗначение(Результа (1), Результат(3)).
5. Вернуть Результат(3).


по скольку возвращается результат 3, то есть ЗНАЧЕНИЕ правого операнда ровно происходит следущее:

(baz /*тут ЗНАЧЕНИЕ*/)()



потом вступают в дело скобки группировки, и начинают смотреть ЧТО ВНУТРИ НИХ НИХ находится. смотрят - там значение, а не ссылка и возвращают значение. Дальше идут в ход скобки вызова и вызывают эту функцию делая её this равным global(null? но работает как global)

__________________________________________________

моя ошибка была в том что я думал что оператор ровно возвращает не ЗНАЧЕНИЕ правого выражения, а ссылку левого выражения)). и это я и пытался выяснить, и как оказалось тут очень мало людей понмиающих как работает javascript. но все ровно всем спасибо) пошел учить спецификацию.

monolithed 11.12.2011 17:49

Цитата:

Сообщение от Livanderiaamarum
Вот в чем вопрос, почему reference меняется на VALUE?

Важно запомнить, что this в контексте функции определяется caller'ом. И все, что определяется слева от () является типом Reference, в противном случае null, а т.к. нет практического смысла возвращать null подставляется Window.
Исходя из вышесказанного выражение типа:
(foo.bar = foo.bar)(); не определяются как Reference, именно по этому возращается Window (в basic mode).

Цитата:

Сообщение от nerv_
Можно ссылку?

11.1.6 Оператор группировки
11.2 Левосторонние выражения
11.13.1 Простое присваивание ( = )

Цитата:

Сообщение от nerv_
Флэнаган предполагает, что строки передаются по ссылке, но сравниваются по значению.

Можно предположить, что прототип функции примерно такой:
template <class T> T GetValue(const T &value);

В этом случае, формально значение передается по ссылке.

Livanderiaamarum 11.12.2011 18:29

можно ссылку?
-------------

держи
http://dmitrysoshnikov.com/ecmascrip...hapter-3-this/

nerv_ 11.12.2011 20:48

всем спасибо)
Цитата:

Сообщение от Livanderiaamarum
и как оказалось тут очень мало людей понмиающих как работает javascript

Не согласен. Вам (да и мне в том числе) уже по нескольку раз объяснили ув. B@rmaley.e><e и monolithed что да как.

B@rmaley.e><e 11.12.2011 22:54

Livanderiaamarum, читать спецификацию — хорошая идея. Возможно, тогда Вы поймёте, что ничто, кроме примитивов (элементарных типов в терминологии стандарта) по значению нигде в процессе выполнения программы появиться не может. Вы никогда не сможете получить объект по значению, только по ссылке.

Livanderiaamarum 11.12.2011 23:21

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 142089)
Livanderiaamarum, читать спецификацию — хорошая идея. Возможно, тогда Вы поймёте, что ничто, кроме примитивов (элементарных типов в терминологии стандарта) по значению нигде в процессе выполнения программы появиться не может. Вы никогда не сможете получить объект по значению, только по ссылке.

вы говорите полный бред.

Простое присваивание ( = )
Значение нетерминала ВыражениеПрисваивания : ЛевостороннееВыражение = ВыражениеПрисваивания вычисляется по следующей схеме:
1. Вычислить значение ЛевостороннегоВыражения.
2. Вычислить значение ВыраженияПрисваивания.
3. Вызвать ПолучитьЗначение(Результа( 2)).
4. Вызвать ЗаписатьЗначение(Результа( 1), Результат(3)).
5. Вернуть Результат(3).


возвращается ИМЕННО VALUE правой стороны а не ссылка. если в правой стороне обьект то возвращается VALUE обеькта. Сколько можно уже это мусолить? вам же на примерах показали. Суть моего вопроса в том, ЧТО ИМЕННО возвращает ровно, как оно берет и что куда кладет. И как выяснилось возвращается не ссылка, а значение, которое посчиталось справа от знака ровно. Консоль показывала то же самое, но мне было интересно почему.


_______________________________________
п.с. получить обьект не по ссылке а по значению можно написав:
{a:20} //это обьект который не имеет ни какой ссылки, и я могу с ним работать в процессе выполнения кода
, что противоречит вашим словам, и именно по этому я и назвал их бредом. уж такое сморозить ЧИТАЯ спецификацию? стыдно должно быть вам.... вы наверное не даже не знаете про типы VALUE и REFERENCE ?

Livanderiaamarum 11.12.2011 23:30

пипец, зашел на этот сайт думая что тут профессионалы сидят.... обломался(((( тут оч мало народа который действительно шарит, в том числе и я((
что печально.


Часовой пояс GMT +3, время: 02:26.