Ile tu jest błędów?

Właśnie, jak w temacie. Pomyślałem, że niezłym pomysłem będzie po prostu wrzucenie kodu i pytanie do Was, co tutaj jest źle? Ten, kto wymieni najwięcej błędów (najlepiej w komentarzach) i odpowiednio wyjaśni każdy z nich zgarnia główną nagrodę jakimi są prestiż i uznanie tutejszych Czytelniczek i Czytelników. Jest o co walczyć, prawda? Po jakimś czasie opublikuję rozwiązanie zagadki.

var foobar = {
	property: Infinity,
	enum = {
		10th: "ten",
		20th: "twenty"
	},
	toString: (function() {
		return (NaN || foobar).toString();
	})(),
	copy: false && this.alert,
	clone: function() {
		this.__proto__ = foobar;
	},
};

var obj = new foobar().clone();

Komentarze

1

tak na szybko od góry:
– Infinity – nie ma takiej zmiennej
– po enum jest znak = a powinno być :
– właściwości enum zaczynają się od cyfr
– toString – wywali błąd zbyt wielu referencji
– this.alert – nie ma tekiej właściwości
– przecinek po clone
– foobar nie jest konstruktorem tylko gotowym obiektem (new foobar)
– no i kod jest bez sensu :)

blisko jestem?
pozdrawiam

pio
2

no nawet, nawet, ale da sie cos wycisnac jeszcze ;-)

3

Generalnie jednak uznajmy, ze 1. odpowiedz sie liczy ;-)

4

Błędy generalnie takie jak wymienił pio (enum=, właściwości zaczynające się od cyfr), ale nie do końca:
• Infinity to stała, oznacza… Infinity. Tu nie ma błędu.
• toString faktycznie jest bez sensu, ale zdaje mi się, że błąd będzie polegał na tym, że .toString będzie wywołane na undefined (bo foobar jeszcze nie jest zdefiniowany w momencie stworzenia lambdy). Ciężkie, mogę się mylić.
• this.alert się nie wykona ze względu na “false &&”. Poza tym… nie wiadomo czy nie ma takiej właściwości w kontekście definiowania tej zmiennej (foobar). A nuż jest? „this” tutaj nie odwołuje się do foobar.
• czy __proto__ to nie jest przypadkiem specjalność tylko Firefoksa?
• Nie powinno być przecinka przed klamrą zamykającą (po clone).
• foobar nie jest funkcją, wywołanie foobar() jest bez sensu. Co innego new foobar.clone() — ta funkcja jest konstruktorem. ;-)

mcv
5

Jeszcze gwoli ścisłości: Infinity to może nie tyle stała co po prostu wartość. Literał. Tak jak liczba, np. 5. ;-) Szczegóły.

mcv
6

no i jeszcze np.:
– enum jest reserved,
– wywołujesz natychmiastowo toString zamiast tworzyć metodę o tej nazwie,
– false && … ? NaN || … ? ;D
– copy pewnie powinno być fkcją
– czy clone nie powinno czegoś zwracać?

wildcard
7

01. OK
02. OK
03. Jest ‘=’, powinno być ‘:’.
04. Nieprawidłowa nazwa właściwości.
05. Nieprawidłowa nazwa Właściwości.
06. OK
07. OK
08. undefined nie jest obiektem i tym samym nie może mieć zaimplementowanej metody toString. undefined to oczywiście wynik wyrażenia logicznego znajdującego się w tej linii, ponieważ foobar nie zostanie zainicjalizowany zanim nie skończy się jego definicja, a ta nie jest zakończona, gdyż owa anonimowa funkcja wykona się natychmiast.
09. OK
10. OK
11. OK
12. ‘foobar’ na tym etapie jest jeszcze niezdefiniowany
13. Formalnie nie jest to błąd, niemniej IE<8 się na tym wywali na pewno i coś mi w głowie świta, że IE8 zachował w tym względzie kompatybilność wstecz, tj. też się wywali.
14. OK
15. OK
16. 'foobar' nie jest funkcją, niemniej gdyby użyć 'new foobar.clone()' to o ile się nie mylę dostalibyśmy z powrotem obiekt "klasy" (celowo używam cudzysłowów, gdyż jak wiadomo tych w JS de facto nie ma) 'foobar'.

Kamil T.
8

[…] false to szybko kończymy zabawę i copy przyjmuje wartość false właśnie. Warto wyróżnić komentarz mcv: this.alert się nie wykona ze względu na “false &&”. Poza tym… nie wiadomo czy […]

Dodaj komentarz

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