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 отрабатывает как ожидается. ТС прав, это косяк. |
Часовой пояс GMT +3, время: 15:16. |