W ostatnich tygodniach przewinęło się „przez moją klawiaturę” kilka łamigłówek JavaScript, ukazujących ciekawostki tego języka. Postanowiłem na ich podstawie utworzyć mały zestawik testowy. Uważasz się za wymiatacza w JS? Sprawdź się!
W każdym z przykładów chodzi o przewidzenie wartości, która wyświetli się w alert. Do dzieła!
alert("i" in window);
var i = "foobar";
alert("i" in window);
(function() {
i = "foobar";
})();
var i;
alert(i);
alert(0.3 === 0.1 + 0.2);
alert(0.5 == 0.2 + 0.3);
function foobar(i) {
return function(i) {
alert(i);
};
};
foobar(false)(true);
function foobar(i) {
return (function(i) {
return i;
})();
};
alert(foobar(false));
function foobar(foo, bar) {
arguments[1] = 'foo';
alert(bar);
}
foobar('foo', 'bar');
function foobar() {
alert(this);
}
foobar.call(0 === false);
function foobar() {};
var obj = new foobar();
foobar.prototype.test = function() { alert('test'); };
obj.test();
function foobar() {
this.test = function() { alert('test1'); }
};
var obj = new foobar();
foobar.prototype.test = function() { alert('test2'); };
obj.test();
Trochę ciekawych konstrukcji języka, ciut prototypów, szczypta scope i tak dalej. Tylko nie oszukujcie…

Komentarze
Zawiodłem przy 1, 2 i 6. Czyli chyba nie jest aż tak źle :P Mam nadzieję, że nie zostawisz nas z pytaniem „ale dlaczego?”.
Panie i Panowie, poszedl maly update na pytanie 4, prosze o ponowne rozpatrzenie zadanka! Z gory przepraszam – literowka.
@pio – jasne, bedzie male wyjasnienie.
Bardzo dobre! Nie jestem co prawda zbyt dobrym programistą Javascript, ale zawsze lubiłem rozwiązywać zagadki :).
A ja mam zagadkę: kiedy stosujemy aprostrof? :)
Fakt, jedno z najglupszych przyzwyczajen jezykowych, ktorych nie moge sie wyzbyc. Dostajesz punkt gratis ;-).
No to ja rzeczywiście mam zagadkę z tym apostrofem – różnica z PHP jest mi dobrze znana, więc z przyzwyczajenia stosują go w JS.
Na czym polega „myk”? :)
Co do apostrofu w komentarzu Jakuba, uznalem, ze chodzi o tytul notki. Zawieral on zbedny apostrof ;-)
Jesli natomiast pytacie o apostrof w kodzie JS, to nie ma zadnej roznicy, oprocz eskejpowania ” i ‘:
var tekst = 'Jakis string z "cudzyslowem"';var tekst2 = "Jakis string z 'apostrofem'";
Nie ma tutaj roznic, jakie wystepuja w PHP – string w cudzyslowach i string w apostrofach sa konwertowane do jednego obiektu klasy String i koniec :-). Fakt, ze natrafilem kiedys na test szybkosciowy tych dwoch metod, jednak wyniki byly na tyle rozbiezne i losowe, ze nie wyciagnieto z nich zadnych wnioskow. Uzywanie apostrofa zostawiam wiec osobistym preferencjom kodera lub przyjetym standardom.
Co do jezyka polskiego, polecam przy okazji http://faxe.jogger.pl/files/pisownia.html
Pio:
Co do 1-ego to wydaje mi się, że: wszystkie globals należą do window.
Co do 2-ego: brak var przy i czyni i globalną. Patrz 1.
Co do 6-ego: funkcja foobar zwraca funkcje która ma własny scope różny od scope funkcji zewnętrznej.Np. spróbuj :
function foobar(i) {
return (
document.write(i+5), function(i) {
alert(i); });
};
foobar(5)(true);
Napisze 10 i alert(true).
Ps: Wywołanie foobar(false)(true) mówi tyle co: weś funkcje foobar wywołaj ją z parametrem false, następnie to co zwróci wywołaj z parametrem true. Foobar zwraca funkcje-obiekt, a nie jej wywołanie.
@m:
Po dłuuuższym zastanowieniu się 6-ka wydała mi się banalna. Jak ja mogłem tego nie zauważyć, hehe.
Za to 1 i 2 ciągle nie dają mi spokoju.
UWAGA SPOILER
Dlaczego „i” jest właściwością window skoro jest deklarowana po alercie? No i dlaczego tak samo nie jest w drugim przypadku, skoro to też jest zmienna globalna?
KONICE SPOILERA
Nie mogę się doczekać wyjaśnień Damiana.