Czy tablica i obiekt dla JS to to samo?

0

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

Mam taki kod napisany w jquery:

$.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:

 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

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:

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.

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:


function dziwna_sprawa() {
   jak_to_do_cholery_dziala();

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

dziwna_sprawa();

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.

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 Jak uczyć się JavaScript? - przeczytaj, zanim zadasz pytanie na temat materiałów do nauki., a w szczególności do przeczytania You Don't Know JS.

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.

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:

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:

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!).

1 użytkowników online, w tym zalogowanych: 0, gości: 1