Dla "koneserów" to jest bardzo fajne i śmieszne, ale też... miejscami nieprawidłowe.
Na Rubym się nie znam, ale na JavaScripcie tak, bo to moja praca (choć nie twierdzę, że "zrobiłbym to taniej" ;-)).
Przy okazji []+{} autor mówi, że otrzymane [object Object] to jest obiekt. W 2:16 chyba nawet ktoś go pyta, czy to taki stringm, czy to obiekt, a autor mówi "no, that's just an object" -- czyli obiekt.
[] + {} wyjaśniłem powyżej. Dwuargumentowy operator + działa albo jak matematyczne dodawanie, albo jak łączenie stringów. Tu mamy łączenie stringów. Pusta tablica zamieniana jest na pusty string, a obiekt na "[object Object]".
{} + [] wygląda podobnie, ale to coś zupełnie innego. Tu nie ma dwuargumentowego operatora +.
Reguły parsowania JS mówią, że jeśli rozpoczynamy nową instrukcję i mamy tam {}, to jest to... nie literał
@argothiel: Żona się kiedyś na mnie wk$!$iła, bo obudziłem ją o 3 w nocy, bo nie mogłem się przestać z tego śmiać. Próbowałem jej tłumaczyć, ale nie wychodziło, i to jeszcze pogłębiało frustrację.
Przy okazji takiego wykopu można jeszcze zaobserwować ciekawe zjawisko. Jest główna z płomykiem, to chociaż 3/4 nie wie o co chodzi, i tak wykopie żeby nie wyjść na głupszych.
Sam chciałem kiedyś taki eksperyment przeprowadzić, ale dzięki tej prezentacji już nie muszę :)
@Ortaldo_returned: js i ruby mają dziwne zachowanie dla jakiś wyszukanych działań. Na tym filmiku zaprezentowano to tak by bawiło we wspaniałej formie. Każdy język programowania ma jakieś takie śmieszne "możliwości".
@divinuss: Czytam Niebezpiecznika, ale dziś tego nie widziałem; wrzucił to ktoś na fejsa u mnie. Gdybym wiedział, że jest to na Niebezpieczniku to nie wrzucałbym na Wykop, bo stwierdziłbym, że większość widziała. :)
Dobra jak się śmiejemy z JS to może ktoś wie czemu w JS obiekt do daty zwraca rok normalnie, dzień miesiąca normalnie, a miesiąc cofnięty o 1 czyli w przedziale 0-11?
@ogur: Bo liczba miesięcy jest stałym zakresem. Liczba dni miesiąca się zmienia w zależności od miesiąca, rok jest czystym intem. Stała w każdym roku jest liczba miesięcy więc dla celów optymalizacji jest zbudowana jako zakres, zakresy jak tablice zaczyna się liczyć od zera.
Znajdź odpowiedni fragmentu kodu w interpreterze, dokumentacji czy czymkolwiek, tam jest napisane obok w komentarzach ;) Ja już to kiedyś sprawdzałem, wewnątrz funkcji jest int-range-int potem jest to
Te śmiechy wskazywałyby, że na sali jest pełno geeków, ale... jak ktoś jest geekiem to wie, że takie kwiatki wynikają z pewnych przyjętych, dość logicznych i zasadnych konwencji.
Denerwujący był koleś co się najgłośniej śmiał. Szczególnie gdy pojawiło się 16 przecinków - wtedy doszedłem do wniosku, że on tak samo nic czai z tej prezentacji jak ja, tyle że ja nie musiałem przed nikim udawać ;)
@niemogewtouwierzyc: Zbyt mało dyskretne, w mojej propozycji aplikacja utraci precyzję i zaczną występować drobne błędy które nie powinny mieć miejsca, w twoim od razu zacznie się wywalać.
@rivver: w zasadzie w każdym języku są pewne cechy, które mogą zdziwić osobę, która nie jest w nim obeznana. W Pythonie dla niektórych zaskakujące może być takie zachowanie:
Ja fuksem powiedziałem, ale myślenie zajęło mi w sumie ze 3 minuty i jeszcze w jednym miejscu nie do końca zczaiłem, co się stało (ale farciarsko wyszedł mi dobry wynik).
Trzeba było sobie to uprościć. Zacząłem od zamiany wszystkich +[] na 0. Najdłuższą chwilę myślałem nad ++[[]] i tu mi się właśnie jakoś popieprzyło, bo powinienem był rozpatrywać ++[[]][0].
To ciężki przypadek, ale jeśli się jest programistą naprawdę zainteresowanym
@mrklucha: Takie szybkie ćwiczenie dla palca wskazującego (tudzież środkowego), gdy przewijasz te linijki niewiadomo czego. Jak recepty z wiedźmiej księgi kucharskiej.
Komentarze (115)
najlepsze
Dla "koneserów" to jest bardzo fajne i śmieszne, ale też... miejscami nieprawidłowe.
Na Rubym się nie znam, ale na JavaScripcie tak, bo to moja praca (choć nie twierdzę, że "zrobiłbym to taniej" ;-)).
Przy okazji []+{} autor mówi, że otrzymane [object Object] to jest obiekt. W 2:16 chyba nawet ktoś go pyta, czy to taki stringm, czy to obiekt, a autor mówi "no, that's just an object" -- czyli obiekt.
Reguły parsowania. Priorytety.
[] + {} wyjaśniłem powyżej. Dwuargumentowy operator + działa albo jak matematyczne dodawanie, albo jak łączenie stringów. Tu mamy łączenie stringów. Pusta tablica zamieniana jest na pusty string, a obiekt na "[object Object]".
{} + [] wygląda podobnie, ale to coś zupełnie innego. Tu nie ma dwuargumentowego operatora +.
Reguły parsowania JS mówią, że jeśli rozpoczynamy nową instrukcję i mamy tam {}, to jest to... nie literał
http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html
Sam chciałem kiedyś taki eksperyment przeprowadzić, ale dzięki tej prezentacji już nie muszę :)
faila na przykład zaliczył koleś który się zaśmiał przy 16 przecinkach (btw - przecinków wyjdzie 15) ;)
(!(![]) + !"") + 1
A później wkleić je sobie do REPL-a node'a :)
Komentarz usunięty przez moderatora
/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc
WAT?
Znajdź odpowiedni fragmentu kodu w interpreterze, dokumentacji czy czymkolwiek, tam jest napisane obok w komentarzach ;) Ja już to kiedyś sprawdzałem, wewnątrz funkcji jest int-range-int potem jest to
String jest tablicą, to niby normalne, zobacz jednak jaki wynik dla Ci polecenie:
=> 97
zwraca miejsce znaku
a
w tablicy ASCII czyli 97.
Co więcej siedzi tu tablica wielowymiarowa:
=> 1
irb(main):007:0> "a"[0][0]
=> 1
irb(main):008:0> "a"[0][0][0]
=> 1
irb(main):009:0> "a"[0][0][0][1]
=> 0
A jeszcze więcej, rozdaje ona wyniki zależnie od parzystości znaku w tablicy ASCII
=> 0
irb(main):015:0> 'c'[0][0][0][0]
=> 1
irb(main):016:0>
Denerwujący był koleś co się najgłośniej śmiał. Szczególnie gdy pojawiło się 16 przecinków - wtedy doszedłem do wniosku, że on tak samo nic czai z tej prezentacji jak ja, tyle że ja nie musiałem przed nikim udawać ;)
I powodzenia w szukaniu błędów.
In [13]: def f(a=[]):
....: a.append(1)
....: return a
....:
In [14]: f()
Out[14]: [1]
In [15]: f()
Out[15]: [1, 1]
In [16]: f()
Out[16]: [1, 1, 1]
In [17]: f()
Out[17]: [1, 1, 1, 1]
http://functr.blogspot.se/2012/08/javawat-part-i.html
http://functr.blogspot.se/2012/08/java-oddities-part-ii.html
++[[]][+[]]+[+[]]
(ładnie wyjaśnione na StackOverflow)
@WRonX:
Ja fuksem powiedziałem, ale myślenie zajęło mi w sumie ze 3 minuty i jeszcze w jednym miejscu nie do końca zczaiłem, co się stało (ale farciarsko wyszedł mi dobry wynik).
Trzeba było sobie to uprościć. Zacząłem od zamiany wszystkich +[] na 0. Najdłuższą chwilę myślałem nad ++[[]] i tu mi się właśnie jakoś popieprzyło, bo powinienem był rozpatrywać ++[[]][0].
To ciężki przypadek, ale jeśli się jest programistą naprawdę zainteresowanym
js'a wykorzystuję tylko do jakichś typowych rzeczy i nie wiem w którym miejscu musiałbym tworzyć takie potworki ;)
Komentarz usunięty przez moderatora