Zauważyłem, że niektórzy nazywają JavaScript językiem „dynamicznie, słabo typizowanym”, ale niektórzy mówią nawet „bez typu”? Co to naprawdę jest?
źródło
Zauważyłem, że niektórzy nazywają JavaScript językiem „dynamicznie, słabo typizowanym”, ale niektórzy mówią nawet „bez typu”? Co to naprawdę jest?
JavaScript nie ma typu:
(źródło: no.gd )
Nawet Brendan Eich tak mówi. Na Twitterze odpowiedział w wątku zawierającym link do tego pytania:
... typy akademickie używają „bez typu” na oznaczenie „brak typów statycznych” ...
Problem polega na tym, że istnieje kilka różnych definicji braku typu .
Jedna z definicji została omówiona w jednej z powyższych odpowiedzi - środowisko wykonawcze nie oznacza wartości i po prostu traktuje każdą wartość jako bity. JavaScript ma wartości zmiennych i ma różne zachowanie na podstawie tych tagów. Więc JavaScript oczywiście nie pasuje do tej kategorii.
Druga definicja pochodzi z teorii języka programowania (akademicka rzecz, do której odnosi się Brendan). W tej domenie brak typu oznacza po prostu, że wszystko należy do jednego typu .
Czemu? Ponieważ język wygeneruje program tylko wtedy, gdy może udowodnić, że typy są wyrównane (aka korespondencja Curry-Howarda ; typy to twierdzenia, programy to dowody). Oznacza to w języku bez typu:
W przeciwieństwie do języka maszynowego:
Więc proszę bardzo, w PLT, brak typu oznacza po prostu wpisywanie dynamiczne, a wpisywanie oznacza po prostu wpisywanie statyczne . W tej kategorii zdecydowanie nie ma kodu JavaScript.
Zobacz też:
1. 2. 3.
dla nietypowego języka nie pasuje do JavaScript. Jest nie tylko jeden typ - jest ich około 4-5. Jak więc to pokazuje, że JavaScript jest nietypowy?mocne / słabe można rozpatrywać w odniesieniu do sposobu, w jaki kompilator, jeśli ma to zastosowanie, obsługuje pisanie.
Słabo wpisany oznacza, że kompilator, jeśli ma to zastosowanie, nie wymusza poprawnego wpisywania. Bez niejawnego wykrzyknika kompilatora instrukcja będzie powodować błąd w czasie wykonywania.
Silnie wpisany oznacza, że istnieje kompilator i chce, abyś jawnie rzutował z łańcucha na liczbę całkowitą .
W obu przypadkach niektóre funkcje kompilatora mogą niejawnie zmienić instrukcję podczas kompilacji, aby wykonać konwersję za Ciebie, jeśli może określić, że jest to właściwe.
Jak dotąd JavaScript można sklasyfikować jako nieposiadający silnej typizacji. Oznacza to, że jest napisany słabo lub nie.
dynamiczny / statyczny można rozpatrywać w odniesieniu do sposobu, w jaki instrukcje językowe manipulują typami.
Typ dynamiczny oznacza, żewymuszany jest typ wartości , ale zmienna po prostu reprezentuje dowolną wartość dowolnego typu.
Typ statyczny oznacza, żetyp zmiennej jest silnie wymuszany, a typ wartości jest wymuszany mniej.
Jak dotąd JavaScript można sklasyfikować jako niestatycznie typowany. Wydaje się również, że jest wpisywany dynamicznie, jeśli w ogóle zostanie wpisany. Musimy więc zobaczyć, co oznacza pisanie.
Typed oznacza, że język rozróżnia różne typy, takie jak string , number , boolean , object , array , null , undefined i tak dalej. Każda operacja jest również związana z określonymi typami. Nie możesz więc podzielić liczby całkowitej przez łańcuch .
Bez typu oznacza, że operacja dzielenia liczby całkowitej przez łańcuch oznaczałaby traktowanie pierwszych czterech bajtów łańcucha jako liczby całkowitej . Dzieje się tak, ponieważ operacje bez typów odbywają się bezpośrednio na bitach, nie ma typów do obserwowania. Wynik będzie całkiem nieoczekiwany:
Ponieważ JavaScript zachowuje się zgodnie z definicją bycia typowanym, tak musi być. Dlatego musi być typowany dynamicznie i słabo.
Jeśli ktoś twierdzi, że JavaScript nie ma typu, to jest to tylko dla teorii akademickiej, a nie dla praktycznego zastosowania.
źródło
JavaScript jest napisany słabo . Z pewnością nie jest „bez typu”, ale jego słabo typizowany charakter zapewnia dużą elastyczność w zakresie niejawnych konwersji.
Pamiętaj, że JavaScript jest również wpisywany dynamicznie. Ta metoda pisania pozwala na coś, co nazywa się „pisaniem kaczym” .
Dla porównania należy wziąć pod uwagę, że JavaScript nie jest typowany silnie ani statycznie. Czasami zrozumienie, czym coś nie jest, może pomóc ci lepiej zobaczyć, co to jest.
źródło
Według autora JavaScript jest również klasyfikowany jako dynamicznie typowany . Witryna Wiki stwierdza, że języki dynamicznie typowane są sprawdzane w czasie wykonywania, a nie w kompilatorze, podczas gdy słabo typowane odnosi się do możliwości zmiany typu w locie w kodzie. Więc tak, jest to zarówno wpisane dynamicznie, jak i słabo.
źródło
Problem w tym, że wielu programistów jest dezorientujący, polega na tym, że takie definicje nie są gdzieś ustandaryzowane. Termin nietypowy język programowania jest niejednoznaczny. Czy to odnosi się do języka, który nie ma typów danych lub języka, który jest wariantem bez typu rachunku lambda ?
JavaScript / ECMAScript ma system typów i wszystkie domeny jego funkcji akceptują dowolny typ specyfikacji referencyjnej. Oznacza to, że w rzeczywistości JavaScript ma jeden typ danych. To kwestia implementacji, która jest ważniejsza dla bardzo zaawansowanych programistów JavaScript. Przeciętny programista JavaScript dba tylko o abstrakcyjne typy danych języka , które zostały określone przez ECMAScript.
W kontekście zwykłego programisty, a nie naukowca czy informatyka teoretycznego, termin „ nietypowy” jest mylący, ponieważ większość ludzi nie robi rachunku lambda. W ten sposób termin dezorientuje masy i wydaje się deklarować, że JavaScript nie ma żadnych typów danych, co jest po prostu nieprawdą. Każdy, kto kiedykolwiek używał,
typeof
wie, że JavaScript ma własne typy danych języka:plony
ECMAScript definiuje następujące typy dla języka:
undefined
,null
,string
,boolean
,number
,object
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Bardziej dokładne oznaczenie dla JavaScript byłoby niejawnie wpisane, wpisane dynamicznie lub słabo / luźno wpisane (lub ich kombinacje), ponieważ JavaScript używa w niektórych przypadkach wymuszania typu, co powoduje, że typ jest niejawny, ponieważ nie trzeba jawnie określać typ swoich zmiennych. Podlega słabo typizowanym, ponieważ w przeciwieństwie do niektórych języków, w których rozróżnia się liczby zmiennoprzecinkowe i całkowite itp., Używa tylko jednego
number
typu, aby objąć wszystkie liczby i wykorzystuje wymuszenie typu wspomnianego wcześniej [sekcja 9 specyfikacji ECMAScript] , w przeciwieństwie do język silnie typizowany, który miałby bardzo specyficzne typy danych (tj. musiałbyś określićint
lubfloat
).Definicje języków z typowaniem statycznym i dynamicznym nie są ustandaryzowane, jednak nie ma też rozmiaru bajtu, gdy komputery zaczynały ewoluować. Pisanie statyczne i dynamiczne najczęściej odnosi się do obecności pewnych cech języka. Jednym z nich jest sprawdzanie typów w czasie wykonywania lub tak zwane dynamiczne sprawdzanie typów . Jeśli używałeś JavaScript, już wiesz, że zdecydowanie czeka on do czasu wykonania, aby sprawdzić typy, dlatego
TypeError
podczas wykonywania kodu pojawiają się wyjątki. Przykład tutajMyślę, że najczęściej wybieraną odpowiedzią jest mylenie polimorfizmu funkcji JavaScript z funkcjami, które akceptują dosłownie wszystko (jak w przypadku nietypowych wariantów rachunku Lambda), co jest błędem asocjacyjnym .
źródło
Pamiętaj, że JavaScript pozwala zapytać, co to jest
typeof(your_variable)
, i porównać typy:5==="5"
zwracafalse
. Dlatego nie sądzę, że można to nazwać bez typu.Jest dynamicznie i (oceniany jako) słabo typizowany. Możesz chcieć wiedzieć, że używa on pisania kaczego (patrz link Andrew) i oferuje OOP poprzez Prototypowanie zamiast klas i dziedziczenia.
źródło
String a = "blah";
anivar a:String = 'blah';
(tj. Zmiennych wpisywanych). Dlatego nie ma typu.Gdy jest wpisany (możesz zapytać „typeof someVar” i poznać jego konkretny typ, jest bardzo słaby.
Dany:
można powiedzieć, że a jest łańcuchem. Jeśli jednak napiszesz:
b jest liczbą int równą 15, więc a zachowuje się jak int. Oczywiście możesz wtedy napisać:
a c będzie równe „5Hello World”, więc a znowu zachowuje się jak ciąg.
źródło
b
równe510
: ideone.com/BRcSW7