Czy tablica i obiekt dla JS to to samo?

Czy tablica i obiekt dla JS to to samo?
Webowiec
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 7 lat
0

Cześć. Jestem całkowicie zielony w javascript.

Mam taki kod napisany w jquery:

Kopiuj
$.ajax({
    data: {
        'data': data
    },
    type: 'POST',
    url: '/strona',
    success: function (response) {
        response = JSON.parse(response);
        if(response.success === true)
        {
            console.log('ok');
        }
        else
        {
            console.log('blad');
        }

    }
});

PHP:

Kopiuj
 echo json_encode([
    'success' => TRUE,
]);

Zastanawiam się dlaczego zarówno response.success === true i response['success'] === true są prawdziwe. zmienna response jest typu Object. Czy w javascripcie obiekt jest jednoznaczny z tablicą? :P

edytowany 2x, ostatnio: flowCRANE
0

W JavaScript możesz odnosić się do pól obiektu poprzez obydwie składnie. Co ma bardzo duże zalety w niektórych sytuacjach. To nie koniec niespodzianek, bo:

  1. Możesz korzystać z zmiennych, które jeszcze nie zostały zdefiniowane,
  2. Kontekst zmiennych jest dla funkcji a nie bloku kodu,
  3. Zmienna 'this' w funkcji zależy od kotenkstu odpalania funkcji. Ta sama funkcja może mieć różny this w zależności od tego w jakim kontekście ją uruchomisz,
  4. Wszechobecne domknięcia mogą nieźle namieszać.

Bardzo interesujący język ale wymaga dużo nauki aby w pełni rozumieć, co się robi.

Klasyczny przykład:

Kopiuj
for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i); }, 100 * i);
}

Przeciętny programista spodziewa się takiego wyniku: 1,2,3,4... itd.
Tymczasem funkcja umieszczona w timeout robi domknięcie nad zmienną 'i' w efekcie kiedy zostanie wywołana 10 razy odnosi się do zmiennej już zinkrementowanej, zatem w efekcie kod wyświetli: 10,10,10,10... itd.

edytowany 1x, ostatnio: flowCRANE
Webowiec
Dzięki za odpowiedź, jednak nie rozumiem co miałeś na myśli z tymi domknięciami?
O8
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 7 lat
  • Postów:17
0

"Możesz korzystać z zmiennych, które jeszcze nie zostały zdefiniowane" - nie prawda :)

0

@owca_82: naprawdę? To wytłumacz nam, dlaczego ten kod działa:

Kopiuj

function dziwna_sprawa() {
   jak_to_do_cholery_dziala();

   function jak_to_do_cholery_dziala() {
     console.log("jakos");
   }
}

dziwna_sprawa();

caer
  • Rejestracja:około 11 lat
  • Ostatnio:10 miesięcy
  • Postów:465
0

Przecież ta funkcja została zdefiniowana bo jest hoisting

0

Pomieszałem pojęcia: zamiast "definiowane" powinno być "deklarowane", reszta się zgadza.

@caer: no w porządku, ale hosting jest robiony przez parser zatem w kodzie można sobie deklarację wrzucać w dowolnym miejscu.

edytowany 1x, ostatnio: flowCRANE
Webowiec
Wyedytuj swoją pierwsząodpowiedź tak, żeby nie było wątpliwości.
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:1788
2
śmieszek napisał(a):

@caer: no w porządku, ale hosting jest robiony przez parser zatem w kodzie można sobie deklarację wrzucać w dowolnym miejscu.

Można, ale nie powinno się tego robić. Wyjątkiem jest przenoszenie szczegółów implementacyjnych na dół pliku. Innymi słowy wszystkie deklaracje funkcji są na dole, a logika na górze, ale tylko w tym wypadku.

śmieszek napisał(a):
  1. Możesz korzystać z zmiennych, które jeszcze nie zostały zdefiniowane (...) Pomieszałem pojęcia: zamiast "definiowane" powinno być "deklarowane", reszta się zgadza.

Deklaracja zmiennej, to: var x. Definicja zmiennej, to x = wartość. Jeżeli używasz use strict, to nie możesz użyć niezdeklarowanej zmiennej, bo dostaniesz ReferenceError (poza strict modem zostanie utworzona zmienna globalna!), a jeżeli spóbujesz wywołać niezadeklarowaną funkcję, to nawet bez use strict go dostaniesz.

Z Twojej perspektywy wydaje Ci się, że możesz wywołać jeszcze niezadeklarowaną funkcję, bo w twoim pliku script.js występuje ona po wywołaniu, ale to nie prawda, bo parser ją i tak przesuwa na górę zasięgu (hoisting). Oczywiście rozumiem skrót myślowy, ale trzeba uwazac, bo nowi nie wiedza o co chodzi :) Dlatego powinniśmy wszystkie zmienne (z uzyciem var) deklarować na początku funkcji (czy też zasięgu).

śmieszek napisał(a):
  1. Kontekst zmiennych jest dla funkcji a nie bloku kodu,

Półprawda. Najnowszy, już powszechnie używany standard, wprowadził słowa kluczowe, które pozwalają nam zadeklarować zmienną o zasięgu blokowym. Są to let i const i to z nich powinniśmy korzystać.

Nie czepiam się, chciałem tylko doprecyzować. Zapraszam tu https://4programmers.net/Forum/JavaScript/284930-jak_uczyc_sie_javascript_przeczytaj_zanim_zadasz_pytanie_na_temat_materialow_do_nauki, a w szczególności do przeczytania You Don't Know JS.

edytowany 4x, ostatnio: Desu
0

Dzięki za dodanie cennych informacji. Nowy standard rzeczywiście bardzo porządkuje język ale jeżeli ktoś jeszcze się nie bawił to polecam nadzbiór TypeScript, który wiele z tych rzeczy również prostuje.

Zobacz pozostały 1 komentarz
LukeJL
No i co takiego TypeScript ma, że rzekomo "prostuje wiele z tych rzeczy" o których mowa w wątku?
caer
to już raczej ClojureScript bym polecał bo w ogóle nie trzeba się tymi dziwactwami przejmować
flowCRANE
@LukeJL: nie pytaj się anonima w komentarzach, bo anonimy nie mogą ich pisać. Poza tym przenosisz dyskusję na temat w miejsce przeznaczone dla off-topu.
caer
@furious programming: pytanie o TypeScript to nie jest offtop w wątku o obiektach javascriptowych?
flowCRANE
@caer: nikt nie zgłosił posta do usunięcia.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8403
2

Zastanawiam się dlaczego zarówno response.success === true i response['success'] === true są prawdziwe.
zmienna response jest typu Object. Czy w javascripcie obiekt jest jednoznaczny z tablicą?

Nie. Po prostu odwoływać się do właściwości obiektów możesz w JS albo po kropce, albo w nawiasach kwadratowych. Służy to do tego, że czasem nie znasz nazwy właściwości w czasie pisania, np. nazwa właściwości jest w zmiennej propertyName, i możesz zrobić coś takiego:

Kopiuj
const propertyName = 'success'; 
console.log(response[propertyName]); //  to na gorze jest rownowazne
console.log(response.success); //  temu na dole

albo jak nazwa właściwości zawiera spacje, np. masz właściwość "kotek na płotek", nie odwołasz się tak:
jakisObject.kotek na płotek, ale już tak się odwołasz jakisObject["kotek na płotek"].

Generalnie obiekty w JS mają dużo wspólnego ze słownikami/hashami/tablicami asocjacyjnymi, jednak nie są to tablice czy listy,

Jeśli chcesz faktycznie napisać tablicę w JS to robisz to tak:

Kopiuj
const numbers = [1, 2, 4, 8, 16, 32]; // zamiast `const` możesz użyć również `let` albo `var` - każde trochę inaczej działa.

I wtedy faktycznie jest to tablica (która ma ustaloną kolejność elementów, długość itp.). Jednak jako że JS jest językiem obiektowym, to każda tablica jest również obiektem (ale nie każdy obiekt to tablica!).


edytowany 4x, ostatnio: LukeJL
Webowiec
Dzięki, przyda się!
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)