Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что за ФИГНЯ?! У этого языка программирования логика вообще есть?! (https://javascript.ru/forum/misc/54626-chto-za-fignya-u-ehtogo-yazyka-programmirovaniya-logika-voobshhe-est.html)

newuser1001 25.03.2015 16:55

skrudjmakdak,
Да, хорошо, спасибо. Но сдается мне, что ты не прав:)

nerv_ 25.03.2015 16:59

Цитата:

Сообщение от MallSerg
foo вернулся )

foo bar гнилой базар :D

А может он не foo, а ффууу?)))

newuser1001 25.03.2015 17:14

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>

skrudjmakdak 25.03.2015 20:06

посмотрел, все правильно. хочу сразу сказать, что у начинающий взрываются мозги от непонимания УКАЗАТЕЛЕЙ. а теперь поехали


//начнем с простого. для начала создадим две переменные:
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.

skrudjmakdak 25.03.2015 20:13

еще хочу добавить. браузер не изменяет объект <div> на <span>. но создает новый объект <span>. получается два объекта <div> и <span>
переменная a ссылается на <div>
а <body> теряет ссылку на <div> и передает указатель на <span>

newuser1001 25.03.2015 20:27

skrudjmakdak,
Спасибо, конечно, за столь подробное объяснение, я бегло посмотрел, пока, позже посмотрю, но ничего нового для себя я не нашел. Ты мог написать проще: в JS все передается по ссылке. Но я по прежнему не вижу связи. Вот в этом примере

http://javascript.ru/forum/misc/5462...tml#post363102

мы имеем 2 ссылки на 2 объекта, точней, на их св-ва, однако ведут они себя по-разному.

skrudjmakdak 25.03.2015 20:31

какое из свойств тебя смущает? первое или второе?

newuser1001 25.03.2015 20:36

skrudjmakdak,
Меня не смущают свойства. Смущает то, мы делаем обоим объектам одинаковые операции, назовем условно, object.setSlot(oldvalue, newvalue), а реакции разные. Это косяк реализации, не надо тут высокие материи искать.

skrudjmakdak 25.03.2015 20:50

во, нашел подходящую статью про сеттеры и геттеры
http://learn.javascript.ru/descriptors-getters-setters

newuser1001 25.03.2015 20:54

skrudjmakdak,
Да я не про геттеры и сеттеры говорю, а про обычное присваивание. оно тупо не отрабатывает в первом случае. Причем, та же самая фишка с innerHTML отрабатывает как ожидается. ТС прав, это косяк.

MallSerg 25.03.2015 20:56

Цитата:

Сообщение от newuser1001
в JS все передается по ссылке.

Наглая лож. Примитивные типы передаются по значению.
Вспоминай пример с строгим сравненим строк )

newuser1001 25.03.2015 21:00

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>

Что скажешь? Укладывается это в рамки твоей "теории"?

skrudjmakdak 25.03.2015 21:15

<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>

чудеса, да и только!

Dim@ 25.03.2015 21:20

newuser1001, странный вы человек, в рамки теории skrudjmakdak это полностью укладывается

newuser1001 25.03.2015 21:20

MallSerg,
Что касается твоих примитивных типов, то вот тебе пример для медитации, позволяющий понять, приблизительно, что происходит на уровне исполнителя
singleton={
 clone: function(){return this}
}

a=singleton.clone()
b=singleton.clone()

alert(a===b)

Серьезные CS - дяди, называют это самовычисляющимися выражениями. Объяснить это энтерпрайзному быдлу обычно не представляется возможным. Чтобы понять все "правильно", желательно написать свой интерпретатор, или хотя бы изучить исходники. Поэтому, существуют разные суррогатные словечки, типа, примитивы, по-значению, ко-ко-ко. Но такой взгляд весьма поверхностен, хотя, наверное, работает, для большинства быдлокодеров, их это устраивает.

newuser1001 25.03.2015 21:23

skrudjmakdak,
Ты когда приводишь какой-то код, ты хоть комментируй как-то его. К чему это? В чем чудеса?

newuser1001 25.03.2015 21:26

Dim@,
Вы не поняли. Этот код работает нормально, как ожидается. Я его привел просто для сравнения. Сравните его с вот этим

http://javascript.ru/forum/misc/5462...tml#post363102

skrudjmakdak 25.03.2015 21:26

Цитата:

Сообщение от newuser1001 (Сообщение 363151)
skrudjmakdak,
Ты когда приводишь какой-то код, ты хоть комментируй как-то его. К чему это? В чем чудеса?

в том что в outerHTML ничего не сохранилось

Dim@ 25.03.2015 21:28

newuser1001, ну сравнил - всё как надо, вы имеете разницу в том, что последние строки не совпадают?

Dim@ 25.03.2015 21:29

skrudjmakdak, зачем человека так пугать?:D

newuser1001 25.03.2015 21:34

Dim@,
Я имею в виду, что присваивание в первом коде не отрабатывает, смотрите внимательно, вам лень 5 строк кода прочитать?

skrudjmakdak 25.03.2015 21:37

все, я пошел спать. я выдохся((

newuser1001 25.03.2015 21:41

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)

и никакие глобальные переменные тебе для этого не нужны, они там вообще не пришей к п*де ладошку.

Так к чему ты эту ахинею написал? Как она с сабжем то соотностится?

newuser1001 25.03.2015 21:43

Цитата:

Сообщение от Dim@
зачем человека так пугать?

Ага, напугали ежа голой жопой. Может Вы поняли, к чему был этот код? Какое он отношение имеет к теме? (код, правда, бредовый -- ну а вдруг!)

Dim@ 25.03.2015 23:11

Цитата:

Сообщение от newuser1001 (Сообщение 363163)
Dim@,
Я имею в виду, что присваивание в первом коде не отрабатывает, смотрите внимательно, вам лень 5 строк кода прочитать?

всё отрабатывает и отрабатывает правильно, в теме на вопрос почему в id1.outerHTML остается прежнее значение ответил tsigel и расписал на примерах skrudjmakdak, поэтому если остались вопросы пересмотрите ещё раз внимательно их сообщения

skrudjmakdak 26.03.2015 09:12

Цитата:

Сообщение от newuser1001 (Сообщение 363170)
Так к чему ты эту ахинею написал? Как она с сабжем то соотностится?

к тому, что меняя свойство у объекта div через outerHTML, который ты находишь через id1=document.getElementById("id1")
свойство это не меняется, а идет ТИПА ПЕРЕХВАТ ЧЕРЕЗ СЕТТЕР и СОЗДАЕТСЯ НОВЫЙ ОБЪЕКТ а свойство текущего объекта НЕ МЕНЯЕТСЯ.
что тут не понятного?

skrudjmakdak 26.03.2015 09:12

либо ты туго доходящий или действительно троль 9000lvl

newuser1001 26.03.2015 09:17

Цитата:

Сообщение от skrudjmakdak
СОЗДАЕТСЯ НОВЫЙ ОБЪЕКТ

там не создается новый объект. У тебя идет присваивание t.
Цитата:

Сообщение от skrudjmakdak
что тут не понятного?

тут все понятно. Непонятно к чему это все.

newuser1001 26.03.2015 09:22

Цитата:

Сообщение от skrudjmakdak
который ты находишь через id1=document.getElementById("id1")
свойство это не меняется, а идет ТИПА ПЕРЕХВАТ ЧЕРЕЗ СЕТТЕР

С чего ты это взял?

skrudjmakdak 26.03.2015 09:23

Цитата:

Сообщение от newuser1001 (Сообщение 363211)
С чего ты это взял?

давай, расскажи свою теорию тогда)

newuser1001 26.03.2015 09:26

skrudjmakdak,
Да моя теория проста, я уже озвучил. Это косяк реализации.

skrudjmakdak 26.03.2015 09:31

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

tsigel 26.03.2015 09:35

А ещё лучше статью на хабре хотябы с 1-м лайком в твою поддержку.

newuser1001 26.03.2015 09:35

skrudjmakdak,
Вот тут
http://javascript.ru/forum/misc/5462...tml#post363049
я об этом писал, но точно весь подковерный процесс не могу описать естественно, я не писал движок, извини.

newuser1001 26.03.2015 09:36

Цитата:

Сообщение от tsigel
хотябы с 1-м лайком в твою поддержку.

Мне насрать на мнение хабробыдла, успокойся.

tsigel 26.03.2015 10:01

newuser1001,
Да я-то спокоен как удав. И на хабре сидят быдлокодеры, и на стек оверфлоу, наверное, в сравнении с Тобой все школьники. Все вокруг Тебя дурачки, а Ты самый умный, опытный, пишешь самый чистый код, даешь всегда самые верные советы и вообще не признанный Гений. Тебе памятник при жизни нужен. Если Ты такой умный - напиши свою реализацию языка/компилятора/интерпритатора и не ной.

newuser1001 26.03.2015 10:06

tsigel,
Если у тебя есть что по делу сказать, скажи, а с комплексами своими обращайся к психоаналитику, они меня не интересуют.

tsigel 26.03.2015 10:15

newuser1001,
По делу и я и многие другие тебе уже все сказали, в ответ на это ты даешь ссылку на одно и тоже место, которое, по твоему сугубо личному мнению, должно что-то доказывать о твоей правоте. Я вижу что переубедить тебя не получается, ты гнешь свою линию не обращая внимания а потчас и игнорируя аргументированные довоты оппонентов.
Исходя из выше описаного у меня напрашивается 2 вывода. Ты либо веселый троль (хотя на самом деле мне в это не верится), либо у тебя проблемы с головой.

Так как моя жена клинический психолог я склоняюсь ко второму варианту. Об этом мне говорит твоя вспыльчивость (человек ради забавы не стал бы так реагировать) и упорность + личные субъективные ощущения. Я бы ставил на эпилепсию или аутизм.

newuser1001 26.03.2015 10:17

tsigel,
Да, несмотря на то, что диваный психолог -- есть баян баянский, хомячьe продолжает...

newuser1001 26.03.2015 10:26

tsigel,
Ладно, побуду твоим психоаналитиком минуточку, раз жена тебе не может помочь в твоей беде. Судя по твоим комментариям, ты относишься к психотипу "быдло обыкновенное". Представители оного, не способны понять программирование в принципе, на приемлемом уровне. Ты это понимаешь, где-то на подсознательном уровне, и тебя это беспокоит. Поэтому, дам тебе один совет. Забудь о динамических ЯП, тебе всегда с ними будет некомфортно. Возьми, например, жабу. Затем, со временем, твои Ылитные позывы удовлетворит Haskell. Ты с этим справишься, я уверен. Твоя проблема в том, что ты выбрал парадигму, которую никогда не поймешь, в силу чисто физических ограничений. Событийная модель и динамика -- это не твое at all.

//thread


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