Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Javascript. Ссылка на экземпляр. / 25 сообщений из 50, страница 1 из 2
29.07.2013, 18:25
    #38347759
lanzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Учебник гласит, экземпляр литерала функции или переменной является неименованным объектом, который именуется только ссылкой, которая на него ссылается.

Не пойму следующее.

window.my_function, window.my_var
- эти свойства содержат ссылки на экземпляры, или объект записан непосредственно в них?
...
Рейтинг: 0 / 0
29.07.2013, 18:29
    #38347762
Малыхин Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Все JS ссылки и информация по этим ссылкам хранится пока на них есть хоть однин указатель
...
Рейтинг: 0 / 0
29.07.2013, 18:34
    #38347767
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
lanzerwindow.my_function, window.my_var
- эти свойства содержат ссылки на экземпляры, или объект записан непосредственно в них?это ссылки.

хотя, если в window.my_var хранится число или строка (в общем, простой тип), то непонятно, что там, может, и сами данные напрямую.

а функция - это объект, так что window.my_function точно будет ссылкой.
...
Рейтинг: 0 / 0
29.07.2013, 19:52
    #38347860
lanzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Ладно, никто толком ни знает, если по чесноку.

Качайте учебник "Дэвид Флэнаган. Javascript. Подробное руководство. 6-е издание" .pdf. После убогого псевдоучебника на javascript.ru, который только и оставляет непонятки, этот как бальзам на душу.
...
Рейтинг: 0 / 0
30.07.2013, 10:38
    #38348216
Gustly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
lanzerЛадно, никто толком ни знает, если по чесноку.

Качайте учебник "Дэвид Флэнаган. Javascript. Подробное руководство. 6-е издание" .pdf. После убогого псевдоучебника на javascript.ru, который только и оставляет непонятки, этот как бальзам на душу.
Я так понял Вы нашли там ответ на ваш вопрос, не могли бы вы его процитировать?
...
Рейтинг: 0 / 0
30.07.2013, 11:17
    #38348280
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
lanzerЛадно, никто толком ни знает, если по чесноку.
Храброе заявление.

lanzerНе пойму следующее.

window.my_function, window.my_var
- эти свойства содержат ссылки на экземпляры, или объект записан непосредственно в них?
Если речь идет об объектах, то в переменных хранятся только ссылки на тот объект.
...
Рейтинг: 0 / 0
30.07.2013, 18:37
    #38349300
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
lanzerУчебник гласит, экземпляр литерала функции или переменной является неименованным объектом, который именуется только ссылкой, которая на него ссылается.

Не пойму следующее.

window.my_function, window.my_var
- эти свойства содержат ссылки на экземпляры, или объект записан непосредственно в них?


Блин. Всегда удивлялся таким формулировкам. Иногда складывается впечатление, что люди, которые пишут книги по программированию начинают забывать русский язык и дабы это скрыть пишут так, что бы всё-ровно никто ничего не понял.

По сути вопроса. в js как и в любом языке есть простые типы и сложные. Всё, что относится к сложным типам в js считается объектом (массив, функция, объект). Остальные типы, не являющиеся потомками перечисленных являются простыми.
Так вот, все значения сложных типов передаются не по значению, а по ссылке, то есть передача в функцию, присвоение a=b и др. операции, не ведут к копированию данного значения по новому адресу, а всего лишь создают новые ссылки на уже существующее значение. А значит, если в переменной лежит объект, функция или массив - то физически в переменной лежит просто ссылка на значение. Если же в ней значение любого другого типа - тогда оно физически лежит в самой переменной.
...
Рейтинг: 0 / 0
30.07.2013, 22:33
    #38349489
lanzer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Лучше всех ответил Программер :)
Программер, как всегда даете грамотный ответ не в первый раз. Большое спасибо.

авторЯ так понял Вы нашли там ответ на ваш вопрос, не могли бы вы его процитировать?
Программер все объяснил. Но книжку все равно читайте.
...
Рейтинг: 0 / 0
30.07.2013, 22:36
    #38349490
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
lanzerавторЯ так понял Вы нашли там ответ на ваш вопрос, не могли бы вы его процитировать?
Программер все объяснил. Но книжку все равно читайте.Значит цитаты не будет. Жаль
...
Рейтинг: 0 / 0
30.07.2013, 23:06
    #38349508
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
ПрограмёрЕсли же в ней значение любого другого типа - тогда оно физически лежит в самой переменной.рискну предположить, что строки, будучи по классификации "простым типом", всё-таки являются объектами, и var str = "aaa" будет ссылкой. Только не совсем ясно, ссылкой на что именно - либо просто на начало массива с символами, либо на какой-то промежуточный объект (в котором хранится этот массив плюс вспомогательные данные). Истина скрыта в глубинах движка.

Т.е. вряд ли var str2 = str приведет к физическому копированию всей строки (в отличии, например, от чисел и булов, где это разумно).
...
Рейтинг: 0 / 0
30.07.2013, 23:31
    #38349524
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Яростный МечПрограмёрЕсли же в ней значение любого другого типа - тогда оно физически лежит в самой переменной.рискну предположить, что строки, будучи по классификации "простым типом", всё-таки являются объектами, и var str = "aaa" будет ссылкой. Только не совсем ясно, ссылкой на что именно - либо просто на начало массива с символами, либо на какой-то промежуточный объект (в котором хранится этот массив плюс вспомогательные данные). Истина скрыта в глубинах движка.

Т.е. вряд ли var str2 = str приведет к физическому копированию всей строки (в отличии, например, от чисел и булов, где это разумно).

Приведёт. Со строками вообще всё конечно сложно. Но...
В js есть тип String (если не ошибаюсь так), который является объектом. А есть обычная строка, которая является просто последовательностью символов. Так вот, единственная хитрость, которая может быть вшита внутрь движка - это механизм copy-on-write (когда значение копируется в момент изменения). Но в итоге внешне мы не заметим разницы между копировании сразу и копировании при изменении.
То есть я рассуждаю так, есть код:
Код: javascript
1.
2.
3.
var str = "hello";
var str2 = str; //теперь str2 = "hello"
str2[1]="a"; //str2 = "hallo", str = "hello"


Если бы в str и str2 лежала бы ссылка на строку (получается на одну и ту же строку), то изменение str2 привело бы к изменению str. А раз этого не происходит, значит в какой-то момент происходит копирование значения по новому адресу.

Вроде так... Но если ошибаюсь где - поправьте :)
...
Рейтинг: 0 / 0
30.07.2013, 23:46
    #38349529
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Во многих платформах (.net, java, javascript) строки являются immutable для оптимизации. Это значит, что строка существует как незменяемый объект в едином буфере строк, а все переменные ссылаются на нужный экземпляр. Работает тот же GC, когда неиспользуемые строки освобождают память. Строку нельзя изменить, её можно только создать с новым значением. Т.е. даже при операции str+="a" создается новая строка и ссылка на неё присваивается переменной. Именно поэтому операции изменения строк в цикле считаются неэффективными и для того же JS рекомендуется собирать строку в массиве с последующим вызовом join - тогда новая строка будет создана один раз в самом конце.
...
Рейтинг: 0 / 0
31.07.2013, 00:31
    #38349538
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Програмёр
Код: javascript
1.
str2[1]="a"; //str2 = "hallo"

эксперименты показывают, что это не так. )
строку нельзя менять присваиванием символа (а в IE даже нельзя узнать значение str2[1], требуется str2.charAt(1))
...
Рейтинг: 0 / 0
31.07.2013, 09:51
    #38349653
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Яростный МечПрограмёр
Код: javascript
1.
str2[1]="a"; //str2 = "hallo"

эксперименты показывают, что это не так. )
строку нельзя менять присваиванием символа (а в IE даже нельзя узнать значение str2[1], требуется str2.charAt(1))

Жееесть. Это невозможно.... То есть я проверил, и оказалось что Вы правы.
Но что за бред, почему интерпретатор ошибку не выплюнул? Я то проверял только str, что бы доказать, что она равна "hello".
А много таких конструкций в данном языке, которые ничего не делают? :)

Так, по поводу ссылок... По поводу js есть поправка. То есть js всего лишь имитирует простые типы данных. Если рассматривать физическое устройство хранения тех же int, float, boolean, string и т.д., то всё это является объектами внутри :). то есть alert(myVar.constructor) для любой переменной выводит её конструктор. А то есть физически получается на всё в переменных хранятся именно ссылки. Но имитируя простые типы js просто получается копирует объекты при изменении.
...
Рейтинг: 0 / 0
31.07.2013, 10:20
    #38349695
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Програмёрто есть физически получается на всё в переменных хранятся именно ссылки. Но имитируя простые типы js просто получается копирует объекты при изменении.
Это для конечного программирования не важно. Достаточно правильно делить на "примитивы" и "объекты".
...
Рейтинг: 0 / 0
31.07.2013, 10:30
    #38349709
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
krvsaПрограмёрто есть физически получается на всё в переменных хранятся именно ссылки. Но имитируя простые типы js просто получается копирует объекты при изменении.
Это для конечного программирования не важно. Достаточно правильно делить на "примитивы" и "объекты".

да да... именно об этом я и говорил в первом сообщении. А вот прошлое дополнил просто во избежания разногласий с Яростный Меч, ведь по сути он тоже прав (говоря что строка - это также объект) :)
...
Рейтинг: 0 / 0
31.07.2013, 10:38
    #38349728
Javascript. Ссылка на экземпляр.
зыВо многих платформах (.net, java, javascript) строки являются immutable для оптимизации. Это значит, что строка существует как незменяемый объект в едином буфере строк, а все переменные ссылаются на нужный экземпляр. Работает тот же GC, когда неиспользуемые строки освобождают память. Строку нельзя изменить, её можно только создать с новым значением. Т.е. даже при операции str+="a" создается новая строка и ссылка на неё присваивается переменной. Именно поэтому операции изменения строк в цикле считаются неэффективными и для того же JS рекомендуется собирать строку в массиве с последующим вызовом join - тогда новая строка будет создана один раз в самом конце.Сведения устаревшие. Поск конкат строк в цикле самая "нативная" для больш программистов, все ведущие движки серьезно над ней поработали.
Прим год назад спец проводили исслед (сбор инфи и некот тесты), чтобы для себя закрыть этот вопрос. Вот , наприм.
...
Рейтинг: 0 / 0
31.07.2013, 11:48
    #38349852
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Програмёрпрошлое дополнил просто во избежания разногласий с Яростный Меч, ведь по сути он тоже прав (говоря что строка - это также объект) :)
Вот тут лучше про такое "забыть"...

Поскольку со строкой прокатит такое

Код: javascript
1.
2.
3.
var a='test';
var b='test';
alert(a==b);


А с "настоящим" объектом - нет.
...
Рейтинг: 0 / 0
31.07.2013, 12:59
    #38350025
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
krvsaПрограмёрпрошлое дополнил просто во избежания разногласий с Яростный Меч, ведь по сути он тоже прав (говоря что строка - это также объект) :)
Вот тут лучше про такое "забыть"...

Поскольку со строкой прокатит такое

Код: javascript
1.
2.
3.
var a='test';
var b='test';
alert(a==b);


А с "настоящим" объектом - нет.

Это да. Но теперь не даёт покоя другое. почему всё же str[1]="a" не производит никаких изменений, но при этом не выдаёт ошибок. Ведь любой, кто придёт из того же паскаля (делфи) как и я, будет думать что код рабочий, даже не подозревая, что данная инструкция не выполняет вообще ничего. Так же не должно быть: или интерпретатор делает то, о чём его просят, или же он сообщает что не может сделать того, о чём попросили... А тут он ничего ни делает и никак об этом не осведомляет программиста.
...
Рейтинг: 0 / 0
31.07.2013, 13:26
    #38350097
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
ПрограмёрНо теперь не даёт покоя другое. почему всё же str[1]="a" не производит никаких изменений
Потому как неможет...

Програмёрно при этом не выдаёт ошибок
А вот это конечно зря...
...
Рейтинг: 0 / 0
31.07.2013, 13:30
    #38350107
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Програмёрно при этом не выдаёт ошибок
Потому как таки "массив".

Код: javascript
1.
2.
3.
4.
5.
6.
var a='test';
a[1]='X';
a['tmp']='E';
alert(a[1]);
alert(a[2]);
alert(a.tmp);
...
Рейтинг: 0 / 0
31.07.2013, 13:43
    #38350141
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
krvsa
Код: javascript
1.
2.
3.
a['tmp']='E';
...
alert(a.tmp);

кстати, в алерте выскочит undefined
Подробности тут
...
Рейтинг: 0 / 0
31.07.2013, 14:04
    #38350183
Javascript. Ссылка на экземпляр.
...
Рейтинг: 0 / 0
31.07.2013, 14:09
    #38350198
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Яростный Мечkrvsa
Код: javascript
1.
2.
3.
a['tmp']='E';
...
alert(a.tmp);

кстати, в алерте выскочит undefined
Подробности тут

ссылка полезная, сенкс...
Но это сколько, простите, надо было выкурить, что бы такое сделать?
То есть, a[1] = "X" создаёт объект-обёртку для строки a, и в свойство ['1'] этого объекта заносит значение "X". А по окончанию данного действия (присваивания данного свойства) удаляет изменённый объект и таким образом оставляет строку без изменений.
Теперь стало понятно почему так... Но новый вопрос... ЗАЧЕМ??!!!
Вообще зачем примитивы оборачивать в объекты (причём скрыто)? Может у разрабов реально была причина на то... Тогда было бы очень интересно узнать для чего. Буду очень благодарен, если кто ссылочку кинет или расскажет.
...
Рейтинг: 0 / 0
31.07.2013, 14:16
    #38350210
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Javascript. Ссылка на экземпляр.
Яростный Мечв алерте выскочит undefined
Да.
Потому как не объект. Т.е. не
Код: javascript
1.
new Object();
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Javascript. Ссылка на экземпляр. / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]