JavaScriptowe zagadki

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

1

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?”.

pio
2

Panie i Panowie, poszedl maly update na pytanie 4, prosze o ponowne rozpatrzenie zadanka! Z gory przepraszam – literowka.

@pio – jasne, bedzie male wyjasnienie.

3

Bardzo dobre! Nie jestem co prawda zbyt dobrym programistą Javascript, ale zawsze lubiłem rozwiązywać zagadki :).

4

A ja mam zagadkę: kiedy stosujemy aprostrof? :)

5

Fakt, jedno z najglupszych przyzwyczajen jezykowych, ktorych nie moge sie wyzbyc. Dostajesz punkt gratis ;-).

6

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”? :)

Michał Fikus
7

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

8

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
9

@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.

Dodaj komentarz

Dozwolone tagi: <blockquote>, <code>, <strong>