@KrzaQ2: Niezła manipulacja, tylko że zamiast anonimowej powinieneś dać dam stoi. Wtedy ktoś może napisać, że niezła #!$%@? bo nie da się dać tam samego stoi.
błąd programisty błędem programisty. Taki kod jest mylący, a język na to bezproblemowo pozwala. I to nie jest ułomność?
@KrzaQ2: Kwestia definicji słowa "ułomność". JS ma bardzo daleko do ideału, ale jeżeli ten przykład jest dowodem na ułomność to praktycznie każdy język jest ułomny. Rozumiem że C++ jest ułomny bo mnie nie powstrzyma przed #define TRUE FALSE albo innym idiotyzmem?
@regis3: ale stoi samo w sobie się nie skompiluje, chroniąc programistę przed ewentualnym błędem. To nie jest ułomność języka. Ułomnością np. jest przełykanie błędnego i mylącego kodu bez nawet zająknięcia.
A udowadniam, ƶe we wszystkich znanych mi językach, czytając kod mapujący listę stringów na inty za pomocą funkcji o nazwach generalnie powiązanych z toint/parseint/read otrzymam listę intów (lub błąd kompilatora/interpretera), dzięki czemu moƶna to nazwać pewnego rodzaju regułą.
#define true false jest idiotyzmem, ale imho gorsze są rzeczy które cięƶko wychwycić w code review, np. przekazanie do algorytmu iteratorów z róƶnych kontenerów o tym samym typie. Kompilator tego nie wychwyci. Wszystko wygląda ok, ale jest UB.
@KrzaQ2: Tylko w takim razie, jak w dynamicznie typowanym języku programista jest powstrzymywany przed błędnym użyciem funkcji bo trochę nie kumam. Wiesz jak działa map w js, wiesz (już) jakie parametry wstrzykuje map, więc gdzie tu jest niejasność.
@regis3: jeśli to niemoƶliwe w js to zdecydowanie nazwałbym taki błąd projektu biblioteki standardowej niedociągnięciem/ułomnością języka. Ruby i Python teƶ są dynamicznie typowane i jakimś cudem są w stanie rzucić wyjątek gdy dostaną inną od spodziewanej ilość parametrów funkcji.
Kod, który dla osoby postronnej jest czytelny, ale robi coś zupełnie innego niƶ moƶna wyczytać nie moƶe być nazwany dobrym, a jeśli język/framework/api/biblioteka w tym nie przeszkadza to jest to błąd.
@regis3: @KrzaQ2: Tak ponad tym co piszecie zasadniczo jeśli funkcja przyjmuje dwa argumenty a dajemy jej trzy albo dowolną ilość argumentów kompilator/parser powinien i tym powiadomić.
// Actual result is an array of numbers (as expected)
"as expected" chyba nie pasuje do reszty ideologii biblioteki. Druga sprawa, to założyłbym, że parseInt domyślnie pobierze jeden element z tablicy a drugi pozostanie domyślny, skoro nie przekazuje do funkcji czegoś typu
> xs = ['10', '10', '10']
> xs.map(parseInt)
[10, NaN, 2]
https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript
#programowanie #javascript #heheszki #humorinformatykow
@KrzaQ2: Niezła manipulacja, tylko że zamiast anonimowej powinieneś dać dam stoi. Wtedy ktoś może napisać, że niezła #!$%@? bo nie da się dać tam samego stoi.
vector vec = {"10", "10", "10"};
vector result;
transform(vec.cbegin(), vec.cend(), back_inserter(result), &atoi);
lepiej?
@KrzaQ2: Kwestia definicji słowa "ułomność". JS ma bardzo daleko do ideału, ale jeżeli ten przykład jest dowodem na ułomność to praktycznie każdy język jest ułomny.
Rozumiem że C++ jest ułomny bo mnie nie powstrzyma przed
#define TRUE FALSE
albo innym idiotyzmem?stoi
samo w sobie się nie skompiluje, chroniąc programistę przed ewentualnym błędem. To nie jest ułomność języka. Ułomnością np. jest przełykanie błędnego i mylącego kodu bez nawet zająknięcia.A udowadniam, ƶe we wszystkich znanych mi językach, czytając kod mapujący listę stringów na inty za pomocą funkcji o nazwach generalnie powiązanych z toint/parseint/read otrzymam listę intów (lub błąd kompilatora/interpretera), dzięki czemu moƶna to nazwać pewnego rodzaju regułą.
#define true false
jest idiotyzmem, ale imho gorsze są rzeczy które cięƶko wychwycić w code review, np. przekazanie do algorytmu iteratorów z róƶnych kontenerów o tym samym typie. Kompilator tego nie wychwyci. Wszystko wygląda ok, ale jest UB.w c# mamy Convert.ToInt32("12", 8);
w js mamy parseInt('12',8);
Serio nie kumam o co chodzi z tym przykładem.
Kod, który dla osoby postronnej jest czytelny, ale robi coś zupełnie innego niƶ moƶna wyczytać nie moƶe być nazwany dobrym, a jeśli język/framework/api/biblioteka w tym nie przeszkadza to jest to błąd.
Ƶeby
@KrzaQ2: Tutaj się zgadzam. Co do reszty to trochę naciągane to było.
Poza tym parametry mogą być domyślne więc to nie rozwiązuje problemu dynamicznego typowania.
~ Scott Meyers
"as expected" chyba nie pasuje do reszty ideologii biblioteki. Druga sprawa, to założyłbym, że parseInt domyślnie pobierze jeden element z tablicy a drugi pozostanie domyślny, skoro nie przekazuje do funkcji czegoś typu
arr.map((element, index, table) => {})
więc parseInt nic nie pobiera. Iterator wywołuje na nim:
parseInt(element, index, table);
3 parametr jest ignorowany, ale 2 pierwsze są jak najbardziej ok. Pierwszy to w naszym przypadku string ('10') a drugi baza systemu liczbowego.
That's it.
edit:
Jedyne czego może nie wiedzieć/ nie spodziewać się programista to fakt że parseInt