Poniższe dwa różne fragmenty kodu wydają mi się równoważne:
var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";
i
var myObject = {'A': 'Athens', 'B':'Berlin'};
ponieważ oboje zachowują się tak samo, a także typeof(myArray) == typeof(myObjects)
(obie dają „przedmiot”).
Czy jest jakaś różnica między tymi wariantami?
javascript
arrays
object
javascript-objects
prinzdezibel
źródło
źródło
title
,description
iitems
właściwości. Wszystko zależy od tego, jak dobrze znasz język i jak go używasz.W JS tablice są obiektami, tylko nieznacznie zmodyfikowanymi (z kilkoma dodatkowymi funkcjami).
Funkcje takie jak:
źródło
Myślę, że ja też jestem metaforyczny i tajemniczy z poprzednią odpowiedzią. Następuje wyjaśnienie.
Instancja Array, Boolean, Date, Function, Number, RegExp, String to obiekt, ale wzbogacony o metody i właściwości specyficzne dla każdego typu. Na przykład tablica ma predefiniowaną
length
właściwość, a obiekty ogólne nie.wyświetlacze
W istocie interpreter FF Gecko rozróżnia również tablice i obiekty ogólne z wyraźnymi różnicami oceniającymi konstrukcje językowe.
wyświetlanie
i
0 1 2 a
i0 1 2 a
.Odnośnie stwierdzenia, że wszystkie obiekty są funkcjami:
Nie jest ani składniowo, ani semantycznie poprawne użycie dowolnej instancji obiektu jako funkcji takiej jak
123()
lub"abc"()
lub[]()
lub{}()
lubobj()
gdzieobj
jest dowolny typ inny niżFunction
, więc dowolny obiekt INSTANCE nie jestFunction
. Jednak biorąc pod uwagę obiektobj
i jego typ jakoArray, Boolean, Date, ...
, jak to sięobj
stałoArray, Boolean, Date, ...
? Co to jestArray, Boolean, Date, ...
?wyświetlacze
W każdym przypadku, bez dwuznaczności, typ obiektu manifestuje się jako
function
definicja, stąd stwierdzenie, że wszystkie obiekty są funkcjami! (To żart w tym, że celowo zasłoniłem i zamazałem rozróżnienie między instancją obiektu a jej typem! Jednak to pokazuje, że „nie możesz mieć jednego bez drugiego”, obiekt i funkcja! Wielkie litery podkreślają typ jako w przeciwieństwie do instancji.)Wydaje się, że zarówno paradygmat funkcjonalny, jak i obiektowy mają fundamentalne znaczenie dla programowania i implementacji wbudowanych prymitywów niskiego poziomu interpretera JS, takich jak
Math
iJSON
itrue
.wyświetlacze
W czasie rozwoju Javascript, modny był obiektowy styl programowania (OOP - Object Oriented Programming style - „s” to moja własna gra słów!). . Funkcjonalne techniki programowania zostały zdegradowane do bardziej abstrakcyjnych i ezoterycznych egzaminów studiujących teorie automatów, funkcji rekurencyjnych, języków formalnych itp. I jako takie nie są tak smaczne. Jednak mocne strony tych formalnych rozważań są wyraźnie widoczne w Javascript, szczególnie w przypadku zaimplementowania w silniku FF Gecko (tj.
.toSource()
).Definicja obiektu dla funkcji jest szczególnie satysfakcjonująca, ponieważ jest zdefiniowana jako relacja powtarzania! zdefiniowane za pomocą własnej definicji!
function Function() { [native code] }
a ponieważ funkcja jest obiektem, ten sam sentyment dotyczy
function Object() { [native code] }
.Większość innych definicji wygasa do statycznej wartości końcowej. Jednak
eval()
jest szczególnie potężnym prymitywem, więc String może również osadzać dowolną funkcjonalność.Zwróć uwagę, że język używany powyżej przesłania typ obiektu i rozróżnienie instancji.
źródło
Wszystko w JavaScript jest obiektem oprócz typów pierwotnych.
Kod
tworzy wystąpienie obiektu Array while
tworzy instancję obiektu Object.
Wypróbuj poniższy kod
Więc zobaczysz różnicę w typie konstruktora obiektów.
Instancja obiektu Array będzie zawierać wszystkie właściwości i metody prototypu Array.
źródło
źródło
Możesz dodać nazwane właściwości do prawie wszystkiego w javascript, ale to nie znaczy, że powinieneś.
Array
w javascript powinno być używane jako lista, jeśli chceszObject
zamiast tego użyć tablicy asocjacyjnej .Uważaj, jeśli naprawdę chcesz użyć elementu
Array
z nazwanymi właściwościami zamiastObject
tych właściwości, nie będzie on dostępny wfor...of
pętli i możesz również otrzymać nieoczekiwane wyniki, gdy zakodujesz go w formacie JSON, aby go przekazać. Patrz poniższy przykład, gdzie wszystkie non-liczbowe indeksy ignorowane:źródło
{}
-Notation jest tylko cukier syntaktyczny aby ładniejszy kodu ;-)JavaScript ma wiele podobnych konstrukcji, takich jak konstrukcja funkcji, gdzie function () jest po prostu synonimem
źródło
{}
to dosłowna notacja obiektu,[]
to dosłowna tablica, nie jestem pewien, jaki jest sens twojej odpowiedzi.