skrudjmakdak,
Да, хорошо, спасибо. Но сдается мне, что ты не прав:) |
Цитата:
А может он не foo, а ффууу?))) |
skrudjmakdak,
И, прежде чем отвечать посмотри внимательно на этот код: <html> <head> </head> <body> <div id="id1" foo="">Click on me</div> <script> id1=document.getElementById("id1") id2={outerHTML: '<div id="id2" foo="">Click on me</div>'} id1.outerHTML=id1.outerHTML.replace("foo", "bar") id2.outerHTML=id2.outerHTML.replace("foo", "bar") alert([id1.outerHTML, "\n", id2.outerHTML]) </script> </body> </html> |
посмотрел, все правильно. хочу сразу сказать, что у начинающий взрываются мозги от непонимания УКАЗАТЕЛЕЙ. а теперь поехали
//начнем с простого. для начала создадим две переменные: var a = 1, b = 2; b = a; a = 3; console.log(a); //= 3 console.log(b); //= 1 //думаю тут вопросов нет //теперь с массивами a = [1, 2, 3]; b = [6, 7, 8]; b = a; a[0] = 0; //выведем console.log(a); //= [0, 2, 3] console.log(b); //= [0, 2, 3] //показывает одинаковые результаты. когда мы написали b = a; то произошла не копия массива, а передалась ссылка. //поэтому когда мы написали a[0] = 0; а потом посмотрели на то что хранится в "b", то увидели тоже самое. т.к. смотрим на один //и тот же массив. поэтому, когда мы присваиваем обычные значения (числа, строки, булевы), то присваиваем ЗНАЧЕНИЕ. а когда объекты, массивы - то передается ССЫЛКА, а не КОПИЯ! это очень при очень важно ![]() если попытаться объяснить на пальцах, то представь комнату с двумя дверьми. ты зашел через одну дверь и положил на стол 100 рублей. потом зашел через другую дверь и там лежат твои самые 100 рублей. надеюсь идея понятна. теперь с элементами смотрим на картинку ![]() html, head, body, ... - это все объекты (кстати массив в javascript это тоже своего рода объект) т.е. когда мы напишем document.body - то мы получим объект <body> у него есть дети <div> и <script> <html> <head></head> <body> <div>123</div> <script> console.log(document.body.children[0]); //выведем <div>. (смотри рисунок 3) //найдем этот див через метод querySelector и запишем в переменную "а" var a = document.querySelector('div'); //т.е. сейчас ситуация подобная как и с массивом. к диву можно получить доступ из 2х мест (смотри рисунок 4) //т.е. <body> ссылается на див и переменная "a" тоже ссылается на див. //также мы можем увидеть, что у <div> есть родитель: console.log(a.parentElement); //теперь напишем нашу проклятую outerHTML a.outerHTML = '<span>5555</span>';//переводя на русский язык мы говорим, что убрать <div> и на место него поставить <span> //да, мы за место <div> поставили <span> но, переменная "а" продолжает ссылаться на <div>. (смотри рисунок 5) //мы просто УБРАЛИ СВЯЗЬ между <body> и <div> НЕ БОЛЕЕ!!! console.log(a.parentElement); //нет родителя у <div> этот объект просто находится в памяти (смотри рисунок 6) </script> </body> </html> ![]() рисунок 3. ![]() рисунок 4. ![]() рисунок 5. ![]() рисунок 6. |
еще хочу добавить. браузер не изменяет объект <div> на <span>. но создает новый объект <span>. получается два объекта <div> и <span>
переменная a ссылается на <div> а <body> теряет ссылку на <div> и передает указатель на <span> |
skrudjmakdak,
Спасибо, конечно, за столь подробное объяснение, я бегло посмотрел, пока, позже посмотрю, но ничего нового для себя я не нашел. Ты мог написать проще: в JS все передается по ссылке. Но я по прежнему не вижу связи. Вот в этом примере http://javascript.ru/forum/misc/5462...tml#post363102 мы имеем 2 ссылки на 2 объекта, точней, на их св-ва, однако ведут они себя по-разному. |
какое из свойств тебя смущает? первое или второе?
|
skrudjmakdak,
Меня не смущают свойства. Смущает то, мы делаем обоим объектам одинаковые операции, назовем условно, object.setSlot(oldvalue, newvalue), а реакции разные. Это косяк реализации, не надо тут высокие материи искать. |
во, нашел подходящую статью про сеттеры и геттеры
http://learn.javascript.ru/descriptors-getters-setters |
skrudjmakdak,
Да я не про геттеры и сеттеры говорю, а про обычное присваивание. оно тупо не отрабатывает в первом случае. Причем, та же самая фишка с innerHTML отрабатывает как ожидается. ТС прав, это косяк. |
Цитата:
Вспоминай пример с строгим сравненим строк ) |
MallSerg,
Ладно, ты не уходи от темы, когда нибудь поймешь и это, я надеюсь. А пока, вернемся к нашей теме: <html> <head> </head> <body> <div id="id1">foo</div> <script> id1=document.getElementById("id1") id2={innerHTML: '<div id="id2">foo</div>'} id1.innerHTML=id1.innerHTML.replace("foo", "bar") id2.innerHTML=id2.innerHTML.replace("foo", "bar") alert([id1.innerHTML, "\n", id2.innerHTML]) </script> </body> </html> Что скажешь? Укладывается это в рамки твоей "теории"? |
<html> <body> <script> obj = { outerHTML: '' } Object.defineProperty(obj, 'outerHTML', { set: function (value) { t = value; } }); t = 5; console.log(t);// равно 5ти obj.outerHTML = 3;// хотим изменить свойства объекта на 3 console.log(t); // проверяем t console.log(obj.outerHTML);// и проверяем outerHTML </script> </body> </html> чудеса, да и только! |
newuser1001, странный вы человек, в рамки теории skrudjmakdak это полностью укладывается
|
MallSerg,
Что касается твоих примитивных типов, то вот тебе пример для медитации, позволяющий понять, приблизительно, что происходит на уровне исполнителя singleton={ clone: function(){return this} } a=singleton.clone() b=singleton.clone() alert(a===b) Серьезные CS - дяди, называют это самовычисляющимися выражениями. Объяснить это энтерпрайзному быдлу обычно не представляется возможным. Чтобы понять все "правильно", желательно написать свой интерпретатор, или хотя бы изучить исходники. Поэтому, существуют разные суррогатные словечки, типа, примитивы, по-значению, ко-ко-ко. Но такой взгляд весьма поверхностен, хотя, наверное, работает, для большинства быдлокодеров, их это устраивает. |
skrudjmakdak,
Ты когда приводишь какой-то код, ты хоть комментируй как-то его. К чему это? В чем чудеса? |
Dim@,
Вы не поняли. Этот код работает нормально, как ожидается. Я его привел просто для сравнения. Сравните его с вот этим http://javascript.ru/forum/misc/5462...tml#post363102 |
Цитата:
|
newuser1001, ну сравнил - всё как надо, вы имеете разницу в том, что последние строки не совпадают?
|
skrudjmakdak, зачем человека так пугать?:D
|
Dim@,
Я имею в виду, что присваивание в первом коде не отрабатывает, смотрите внимательно, вам лень 5 строк кода прочитать? |
все, я пошел спать. я выдохся((
|
skrudjmakdak,
Ты сам то понял что написал? LOL. ты меняшь свойство глобальной переменной, а obj.outerHTML тут причем? Он у тебя как был undefined, так и остался. Если хочешь его менять, напиши, например, так: obj = {outerHTML_: ""} Object.defineProperty(obj, 'outerHTML', { get: function(){return this.outerHTML_}, set: function (value) { this.outerHTML_ = value; } }); obj.outerHTML=10 alert(obj.outerHTML) и никакие глобальные переменные тебе для этого не нужны, они там вообще не пришей к п*де ладошку. Так к чему ты эту ахинею написал? Как она с сабжем то соотностится? |
Цитата:
|
Цитата:
|
Цитата:
свойство это не меняется, а идет ТИПА ПЕРЕХВАТ ЧЕРЕЗ СЕТТЕР и СОЗДАЕТСЯ НОВЫЙ ОБЪЕКТ а свойство текущего объекта НЕ МЕНЯЕТСЯ. что тут не понятного? |
либо ты туго доходящий или действительно троль 9000lvl
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
skrudjmakdak,
Да моя теория проста, я уже озвучил. Это косяк реализации. |
мне нравятся такие ответы. он (твой ответ) настолько развернутый что аж развернутей некуда. ну или тыкни где ты это подробно писал об этом. какие ответы ты получил, что ожидал
|
А ещё лучше статью на хабре хотябы с 1-м лайком в твою поддержку.
|
skrudjmakdak,
Вот тут http://javascript.ru/forum/misc/5462...tml#post363049 я об этом писал, но точно весь подковерный процесс не могу описать естественно, я не писал движок, извини. |
Цитата:
|
newuser1001,
Да я-то спокоен как удав. И на хабре сидят быдлокодеры, и на стек оверфлоу, наверное, в сравнении с Тобой все школьники. Все вокруг Тебя дурачки, а Ты самый умный, опытный, пишешь самый чистый код, даешь всегда самые верные советы и вообще не признанный Гений. Тебе памятник при жизни нужен. Если Ты такой умный - напиши свою реализацию языка/компилятора/интерпритатора и не ной. |
tsigel,
Если у тебя есть что по делу сказать, скажи, а с комплексами своими обращайся к психоаналитику, они меня не интересуют. |
newuser1001,
По делу и я и многие другие тебе уже все сказали, в ответ на это ты даешь ссылку на одно и тоже место, которое, по твоему сугубо личному мнению, должно что-то доказывать о твоей правоте. Я вижу что переубедить тебя не получается, ты гнешь свою линию не обращая внимания а потчас и игнорируя аргументированные довоты оппонентов. Исходя из выше описаного у меня напрашивается 2 вывода. Ты либо веселый троль (хотя на самом деле мне в это не верится), либо у тебя проблемы с головой. Так как моя жена клинический психолог я склоняюсь ко второму варианту. Об этом мне говорит твоя вспыльчивость (человек ради забавы не стал бы так реагировать) и упорность + личные субъективные ощущения. Я бы ставил на эпилепсию или аутизм. |
tsigel,
Да, несмотря на то, что диваный психолог -- есть баян баянский, хомячьe продолжает... |
tsigel,
Ладно, побуду твоим психоаналитиком минуточку, раз жена тебе не может помочь в твоей беде. Судя по твоим комментариям, ты относишься к психотипу "быдло обыкновенное". Представители оного, не способны понять программирование в принципе, на приемлемом уровне. Ты это понимаешь, где-то на подсознательном уровне, и тебя это беспокоит. Поэтому, дам тебе один совет. Забудь о динамических ЯП, тебе всегда с ними будет некомфортно. Возьми, например, жабу. Затем, со временем, твои Ылитные позывы удовлетворит Haskell. Ты с этим справишься, я уверен. Твоя проблема в том, что ты выбрал парадигму, которую никогда не поймешь, в силу чисто физических ограничений. Событийная модель и динамика -- это не твое at all. //thread |
Часовой пояс GMT +3, время: 08:43. |