Odnosnik do obiektu tworzy nowy osobny obiekt?!

Odnosnik do obiektu tworzy nowy osobny obiekt?!
goku21
  • Rejestracja:około 7 lat
  • Ostatnio:6 miesięcy
  • Postów:91
0

Witajcie, jesttem w miare nowy w nodejs ale pewna przypadlosc nodejs mnie przerazila....
jest sobie taki kod:

Kopiuj
getOrdersToDo(newOrders)
    {
        let ordersToDoArr = [];

        this.activeOrders.map((activeOrderChain, activeIndex) => {
            let isInNewOrders = false;
            newOrders.map((newChain, newIndex) =>{
                if(activeOrderChain.makerId === newChain.makerId)
                {
                    isInNewOrders = true;
                    let slicedNewChain = newOrders.splice(newIndex, 1)[0];
                    if(activeOrderChain.getMakerStep().price !== newChain.getMakerStep().price)
                        ordersToDoArr.push(this.getUpdatedOrder(activeIndex, slicedNewChain));
                }
            })
.........

    getUpdatedOrder(activeIndex, newChain)//activeChain, newChain)
    {
        let activeChain = self.activeOrders[activeIndex];
        let newMakerStep = newChain.getMakerStep();
        newMakerStep.orderId = activeChain.getMakerStep().orderId;
        newMakerStep.status = "toChange";
        newMakerStep.callback = this.updateOrderIdCallback;
        newMakerStep.gamePrice += this.addFragmentPrice(newMakerStep.type, newMakerStep.price);
        self.activeOrders[activeIndex] = newChain;
        return activeChain.getMakerStep();
    }

Dziala poprawnie. Jesli natomiast metode getUpdatedOrder zmodyfikuje w ten sposob:

Kopiuj
    getUpdatedOrder(activeIndex, newChain)//activeChain, newChain)
    {
        let activeChain = self.activeOrders[activeIndex];
        let newMakerStep = newChain.getMakerStep();
        newMakerStep.orderId = activeChain.getMakerStep().orderId;
        newMakerStep.status = "toChange";
        newMakerStep.callback = this.updateOrderIdCallback;
        newMakerStep.gamePrice += this.addFragmentPrice(newMakerStep.type, newMakerStep.price);
        activeChain = newChain; // **<<<---- !!!!!!!!!!!!**
        return activeChain.getMakerStep();
    }

To teraz jesli sie tam zdebuguje i sprawdze self.activeOrders, to wychodzi ze polecenie activeChain = newChain; nie wplywa na obiekt w tablicy tylko tak jakby polecenie let activeChain = self.activeOrders[activeIndex]; tworzylo NOWY obiekt a nie tylko powiazanie do juz istniejacego.... Innymi slowy activeChain to newChain ale w self.activeOrders[jakisIndexobiektuActiveChain] jest dalej stary chain bez zmian WTF??!!

edytowany 5x, ostatnio: goku21
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:1788
3

To żaden WTF. activeChain = newChain zastępuje odniesienie do obiektu pobranego z tablicy, odniesieniem do obiektu newChain. Tutaj już o tym pisałem: https://4programmers.net/Forum/JavaScript/285475-przekazywanie_argumentow_do_funkcji_przez_referencje (pierwsze dwa listingi).

Jeżeli zrobisz:

Kopiuj
activeChain.dupa = 'asd';

to w rzeczy samej zmodyfikujesz obiekt, który znajduje się w tablicy. Jeżeli natomiast przypiszesz do zmiennej activeChain inną wartość, to od teraz ta zmienna będzie trzymała odniesienie do nowego obiektu, a stary pozostanie nienaruszony. Generalnie sporo języków w ten sposób działa. Jeżeli chcesz zmodyfikować coś w sposób z drugiego listingu, to w innych językach musisz użyć pointerów (języki z rodziny C, Go).

@goku21 To działa mniej więcej tak:
Webp.net-gifmaker.gif

Dopiero arr[0] = jim zmienia tablicę. Na samym końcu john znika z pamięci, bo ostatnie odniesienie do niego zostało zastąpione :)

edytowany 7x, ostatnio: Desu
goku21
  • Rejestracja:około 7 lat
  • Ostatnio:6 miesięcy
  • Postów:91
0

Dzieki za odpowiedz :)

Czyli wlasciwosci mozemy modyfikowac. Mozemy zrobic np cos takiego:
Class1

Kopiuj
constructor(){
     this.arr1 = [1,2,3];
}

Class2
constructor(arr)
{
    this.arr2 = arr;
   this.add(4);
}

add(num)
{
  this.arr2.push(num);
}

tutaj i tablica w class1 bedzie miala wartosc [1,2,3,4] i tablica w class2 bedzie miala ta sama wartosc poniewaz arr2 jest w sumie referencja do tablicy arr1? Natomiast jesli napisze arr2 = []; to po prostu zmienie referencje zmiennej arr2 do nowej pustej tablicy a arr1 w class1 pozostanie bez zmian. W sumie fakt heh czasami czlowiek slepnie;p

Moim zdaniem najwieksza bolaczka javascript jest brak wymuszania typow, klasy bez zmiennych prywatnych, brak interfejsow.

edytowany 2x, ostatnio: goku21
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:10 minut
  • Postów:8411
1

Moim zdaniem najwieksza bolaczka javascript jest brak wymuszania typow, klasy bez zmiennych prywatnych, brak interfejsow.

Zbyt daleko posunięte wnioski.

Przykłady, które podałeś raczej jeśli już, to są argumentem za tym, że w JS najlepiej po prostu by było nie zmieniać ani obiektów, ani tablic, a traktować wszystko jak niezmienne (immutable). I dzięki temu nie byłoby strachu, że klasa B będzie zmieniać tablicę należącą do klasy A. Bo zamiast modyfikować, to tworzyłbyś nową tablicę zmapowaną/przefiltrowaną/itp.

I dlatego właśnie programowanie funkcyjne jest tak popularne w JS (chociaż moim zdaniem aż za bardzo popularne, ludzie w dogmatyzm popadają).


edytowany 1x, ostatnio: LukeJL
goku21
  • Rejestracja:około 7 lat
  • Ostatnio:6 miesięcy
  • Postów:91
0

Oj cos mi tu nie pasuje :) Zalozmy ze mam obiekty ktore moga byc w stanie a,b,c. I jak tu teraz nie przełączać obiekty miedzy stanami tylko traktowac raz przypisany stan do obiektu jako niezmienialny?:>
Ok mozesz tworzyc nowy obiekt ze zmienianym stanem ale czy na pewno o to chodzi zeby kazda "zmienna" byla publiczna, globalna stałą?

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:10 minut
  • Postów:8411
0

No, zwykle się po prostu tworzy nowy obiekt, który jest taki sam jest poprzedni, tylko, że ma np. 1 właściwość inną.

I jak tu teraz nie przełączać obiekty miedzy stanami tylko traktowac raz przypisany stan do obiektu jako niezmienialny?:

czy na pewno o to chodzi zeby kazda "zmienna" byla publiczna, globalna stałą?

Nie musi być globalna, możesz wstrzykiwać obiekty do funkcji jako parametry. Tym sposobem jakaś funkcja będzie widziała tylko dane wcielenie obiektu.

Np. tak:

Kopiuj
let currentState

function foo(state) {
      // .........
}
currentState = {a: 123};
foo(state);

currentState = {a: 245};
foo(state);

można się też umówić tak, że funkcja zwraca nową wartość stanu (tak działa Redux):

Kopiuj

let currentState = [];

function foo(state) {
     // zwracamy nową wartość stanu, ale nie zmieniamy jego,
     // bo concat tworzy nową tablicę
     return state.concat('kotek'); 
}
currentState = foo(state);
currentState = foo(state);
currentState = foo(state);

I są też inne podejścia.


edytowany 1x, ostatnio: LukeJL
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)