Autor Zpráva
ah01
Profil
Před chvílí se tu opět řešil problém se sčítáním čísla a řetězce. V odpovědi uvedl peta pár metod jak to udělat abychom dostali očekávaný výsledek. Když jsem si to pročítal, napadla mě myšlenka, zdali přesně víte jak se chová toto převádění v každé situaci? Napsal jsem proto těchto pár příkladů:

Hádanka první:
alert( 1 + "2" ); // a

alert( 1 - "2" ); // b

alert( 1 + "2" * 1 ); // c
alert( ( 1 + "2" ) * 2 ); // d

alert( 1 + "0.9" ); // e
alert( 1 - "0.9" ); // f

alert( 1 + parseInt("08") ); // g
alert( 1 + parseFloat("08") ); // h

alert( 1 + parseInt("0xbox360") ); // i
alert( 1 + parseFloat("0xbox360") ); // j

alert( - 1 + parseInt("-Infinity") ); // k
alert( - 1 + parseFloat("-Infinity") ); // l

Otázka je jasná. Co se vám zobrazí v jednotlivých alertech. Je mi jasné, že není problém to vyzkoušet, takže se také zeptám: Proč? Prosím, zkuste to nejprve aniž byste kód spouštěli. Jsem zvědavý jak si povedete.

A nyní něco poněkud obskurnějšího (tento kousek kódu jsem si napsal asi před rokem, když jsem si pročítal ECMAScript specifikaci, vezte že ačkoli to vypadá poněkud divně, funguje to):

Hádanka druhá:
var a =  1;

var b = '1';
alert( a + b ); // a
alert( a + + b ); // b
alert( a ++ + ++ b ); // c
alert( ++ a + + b ++ ); // d
alert( a + + + + + b ); // e

Stejná otázka jako výše.


Doufám, že jsem se v názvu vlákna spletl, a že žádné hádaní nebude potřeba :-)
souki
Profil
a teď to zkus s číslem 09 :)
ah01
Profil
souki
Pokud máš na mysli 1g, tak tam se toho moc nezmění.
souki
Profil
nj, nevšimnul jsem si. U 08 se nezmění, ale u 09 už ano
peta
Profil
http://peter-mlich.wz.cz/x/ww/js/operatory.htm
mam to z nejake oficialni literatury, tusim z mozilly.

a + + + + + b
a++ + ++b ... je zvyseni a pred a zvyseni b po, v tomto pripade oboji bere jako cisla a mela by vyjit c = 3, a=2, b=2
ah01
Profil
peta
2c a 2e, tedy a++ + ++b a a + + + + + b není to samé, ačkoli to má stejný počet "+". Jinak s 2c máš pravdu. Co to ostatní?
peta
Profil
ah01
aha, nj, pravda. viz ta tabulka + + je nesmysl (tj, na vysledek bych se nespolehal, alespon takova operace neni v tabulce) a + + +, + + + +, + + + + + take, takze teoreticky undefined, false, error. Jeste by se to mohlo zachovat jako +.

ty ostatni by take meli byt uvedeny v tom manualu (moz nebo to bylo w3c, odku jsem to kopcil)
na tech ostatnich proste neni nic zahadneho...

alert( 1 + "2" ); // a - retezec 12
alert( 1 - "2" ); // b - nesmysl
alert( 1 + "2" * 1 ); // c - cislo 3
alert( ( 1 + "2" ) * 2 ); // d - viz 3 predchozi, cislo 24
alert( 1 + "0.9" ); // e - viz prvni, retezec
alert( 1 - "0.9" ); // f - nesmysl
alert( 1 + parseInt("08") ); // g - teoreticky cislo 9
alert( 1 + parseFloat("08") ); // h - totez
alert( 1 + parseInt("0xbox360") ); // i - nesmysl, aspon jsem se s takovym zapisem nesetkal
alert( 1 + parseFloat("0xbox360") ); // j - nesmysl
alert( - 1 + parseInt("-Infinity") ); // k - teoreticky 0
alert( - 1 + parseFloat("-Infinity") ); // l - totez

ty teoreticky a nesmysl bych asi nikdy nepouzil, takze si nejsem jist, ale nepovazuji to tudiz za dulezite.

Jestli si chces hrat, tak totez muzes zkusit s podminkami a zkus udelat na to stranku, bude to zajimat vic lidi, jaky je vysledek.
alert(podminka)
podminka = (a=b)
(a=b)
(a==b)
(a===b)
(""===1)
(""==1)
(""=1)
("a"===1)
("a"==1)
("a"=1)
...
ah01
Profil
peta
"+ +" je zcela legitimní operace, je třeba si ale uvědomit, že to není jeden samotný operátor ale 2, resp 3, 4...
Jen drobná nápověda, pokud napíšu 1 + - 1, tak ti to určitě tak divný už nepřijde, ne? (pominu to, že z formálního hlediska by tam měla být Závorka, ale to zařídí priorita operátorů)

U všech příkladů kromě 1g jsem si takřka na 100% jistý, že to dá všude stejný výsledek. 1g je totiž neurčitě zapsané už ve specifikaci. Podle mého zkoumání se chová IE (6 i 7), FF a Win Safari stejně a jen Opera (kupodivu, že) jinak (zkoušeno pod Win).

Takže to tvá odpověď u 1g je správně u Opery. Samozřejmě, že jsou to trochu divné příklady a v praxi by je úmyslně nikdo nepoužíval, ale klidně se může stát, že do políčka pro číslo někdo zadá překlepem "08" a bude očekávat že se to zpracuje jako číslo "8" a ejhle, ono ne. 1a je jasné, to je jen tak na rozehřátí, stejně jako 1c, 1d a 1e. Jinak 1b a 1f nesmysly nejsou, výsledkem je číslo. 1i i 1j vrátí číslo, každý ale jiné. 1k a 1l ukáže něco jiného.

Jen podotknu, že mam na mysli to, jak by to zpracoval dnešní JS. Dočet jsem se totiž, že historický JS 1.0 neměl NaN, takže veškeré převody na číslo, které byly neúspěšné (dnes by vrátili NaN) tehdy vrátili 0. Zmiňuje to poroto, že u 1k by pak peta měl pravdu.


Ono podobných zajímavých konstrukcí by se dalo vymyslet více a to nejen s podmínkami. Uvidím jaký bude mít úspěch tohle, když tak můžu vymyslet i další JS hádanky.
peta
Profil
ah01
aha, nj + +, ale, jak uz jsem rekl, nepouzil bych to takto, ale promenna se chova zrejme podobne.
Odkazovat na neco 1k je chyba. Nikdo nevi, oc se jedna :) Vubec se nedivim, ze dokumentace k programum jsou delane tak, jak jsou, kdyz si to tak procitam po tobe :)

Opera nekdy spravne fungovala? Kdy to bylo naposled?
Tesi mne vsak, ze pomalu nektere chyby odstranuji.
Ale obavam se, ze JS 1.2 ani 1.5 v ni nikdy fungovat spravne nebude a tentyz vyvoj ocekavam i pro vyssi verze, 1.7 a pod. Zatim jeste nemaji zvladnute zakladni prikazy a bez nich jim vyssi verze nebudou spravne fungovat.
ah01
Profil
peta
1k znamená "první hádanka" alert "k" (proto jsou tam ty komentáře s písmeny)
ah01
Profil
Tak co milí javaskriptaři, to už si nikdo netroufne? Pokud se vám zdá hádanka jako nedůstojný název, říkejme tomu třeba hlavolam, to už zní lépe, ne?
Chamurappi
Profil
Hlavolam 1:
a) "12", protože pokud je jeden z operandů sčítání řetězec, je převeden i ten druhý.
b) -1, protože se oba operandy odčítání převádí na čísla.
c) 3, protože se oba operandy násobení převádí na čísla.
d) 24, protože to je "12" * 2.
e) "10.9", protože jeden z operandů sčítání je řetězec.
f) 0.1, protože operace je odčítání.
g) 1, protože „8“ není platný znak osmičkové soustavy.
h) 9, protože parseFloat jede v desítkové soustavě.
i) 12, protože po šestnáctkovém „b“ není platný znak šestnáctkové soustavy.
j) 0, protože „x“ není platný znak desítkové soustavy, ani desetinná tečka.
k) + l) Nemám tušení.

Hlavolam 2:
a) "11", protože jeden z operandů sčítání je řetězec.
b) 2, protože druhé plus udělá z béčka číslo.
c) 3, protože inkrementace (post i pre) převádí řetězec na číslo; po provedení jsou obě proměnné rovny 2
d) 5, protože to je 3 + 2; po provedení jsou obě proměnné 3
e) 6, protože to je součet trojky s opravdu, ale opravdu kladnou trojkou :-)
Pokud jsem neměl ty úkony provádět postupně, ale každý na zelené louce, pak je d) stejné jako c) a e) stejné jako b).

Reaguji na ah01:
Teď si zkus lámat hlavu ty :-)
ah01
Profil
Chamurappi
Výborně :-).

Jen v bodu f to není přesně 0.1. Na tomto principu byla například založena první Seznamácká hádanka.

U hlavolamu 2 na sebe mají jednotlivé alerty navazovat.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0