Problémy s JavaScript v praxi

Re:Problémy s JavaScript v praxi
« Odpověď #330 kdy: 04. 10. 2018, 21:27:51 »
Teď nevím, co se tím pokoušíš říct...


Trolek

Re:Problémy s JavaScript v praxi
« Odpověď #331 kdy: 04. 10. 2018, 21:36:13 »
Problemy v praxi: dynamicnost jazyka a nejasna specifikace jazyka/nekolik verzi. (Takove ty legrace s `==`, `+`, `undefined`/`null`, `this`... uz asi zaznely)

Na jednu stranu je super, ze v JS velice rychle napisete aplikaci... smekam! Jenze jsem zatim nevidel aplikaci psanou v JS, ktera by casem nepozrala sama sebe. Nejvetsi bolistka je dynamicnost jazyka - pokud potrebuji neco zmenit/pridat/opravit, vzdy musim aplikaci lokalne spustit, pripojit debugger a podivat se, co mi proteka v parametrech - az pak mohu zacit realne pracovat. Vzdy, kdyz jsem neco psal v JS, jen debugovanim kodu jsem zabil spoustu casu a porad dokola - spustit, breakpoint, watch, zmena kodu, repeat...

Ke specifikaci: kdyz jsem s JS zacinal, poctive jsem si nastudoval specifikaci Ecma Scriptu (vim, neni to to same!). A pak prisel prvni import a ja byl v koncich. Nakonec jsem dohledal asi ctyri ruzne zpusoby, jak neco imporotvat, zadny ale neodpovidal tomu, co jsem se drive naucil. Byl to moc hezky zacatek, vzdy mi ukapne slzicka, kdyz si na to vzpomenu.

BoneFlute

  • *****
  • 2 046
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #332 kdy: 04. 10. 2018, 21:56:33 »
Teď nevím, co se tím pokoušíš říct...

1, "x" - jsou pouze hodnoty. Nemají identitu.
new Int(1), new String("x") - mají navíc identitu. Tudíž se v některých jazycích platí:
Kód: [Vybrat]
new Int(1) != new Int(1)
Což není hezké.

Re:Problémy s JavaScript v praxi
« Odpověď #333 kdy: 04. 10. 2018, 22:01:56 »
Tak ja teda neviem... Facebook, Netflix či Uber by podľa vašich kydov nemali vlastne fungovať. Uber už vôbec nie, keďže nepoužívajú vo svojom frameworku TypeScript. Vlastne aj kopec iných mega projektov Fortune500 firiem vlastne nemá fungovať, a ešte ich aj riadia idioti frčiaci na Reacte či Angulare. A programovať vedia len miestne esá. My, ktorí máme radi JS sme vlastne len lopaty, lepiči a pod. Hm. Nejak mi tu však nesedí. Obzvlášť to, že JS seniori sú už lepšie platení ako C# lopaty a siahajú platovo už na Java seniorov. Ale tak asi iba niečo prehliadam. Veď čo ja môžem vedieť s 25 rokmi praxe. Vedia len tí, čo ani len nemajú toľko rokov čo ja tej praxe. Holt, svet patrí mladým... :D:D:D:D

Trolek

Re:Problémy s JavaScript v praxi
« Odpověď #334 kdy: 04. 10. 2018, 22:56:34 »
... Obzvlášť to, že JS seniori sú už lepšie platení ako C# lopaty a siahajú platovo už na Java seniorov. ...

Ono jestli to neni spise poptavkou nez kvalitou vyvojaru. Zatimco treba v C# se povazuje za zaklad znalost GC, asynchronniho programovani, paralelismu, multithreadingu, zamykani/synchronizace, ... a buhvi co jeste, v JS tohle clovek vubec neresi. Neznam moc JS vyvojaru, kteri vubec vidi do hloubky (ani nemaji poneti, jak funguje event loop!), ale ten kod proste vysypou. Nehodnotim, kdo je lepsi/horsi, poptavka je po jednom a podle vyse platu usuzovat nelze (... jinak by samozrejme C# vyvojari brali nejvice ;)).

JS nekomu sende, nekomu ne, je to asi hodne o zvyku a zpusobu mysleni. Nekdo se v dynamickem jazyce ztraci, jiny povazuje typovy system za prilis restriktivni - a to tak nejak vidim v diskusi. Problemy existuji, nekomu nevadi, nekdo je povazuje za featuru, a pro nekoho jsou proste no-go.


eee

Re:Problémy s JavaScript v praxi
« Odpověď #335 kdy: 04. 10. 2018, 23:42:48 »
Tady se přidám ke Kitovi - fakt si ten manuál přečti.

V JS operátor == nemá význam "porovnej 'a' a 'b' podle obsahu", ale "porovnej 'a' a 'b' a v případě potřeby je přetypuj". V tom je jádro problému.

Citace
'aa' == new String('aa')

Tady porovnáváš hodnotu s objektem. No a objekt není hodnota. Je to sice nešťastné, ale je to tak právě proto, že to je konzistentní se zbytkem. Samozřejmě by to mohlo být lepší, ale na webu má zpětná kompatibilita takovou prioritu, takže třeba změny chování operátoru pro porovnání nepřipadají moc v úvahu. Pokud se s tím někdo smířit nedokáže, tak má na výběr ze stovek transpilovaných jazyků. Každopádně vytvářet řetězce pomocí new String jsem snad ani nikde neviděl, nikdo to nepoužívá.

Citace
new String('aa') == new String('aa')
{} == {}

Tady zase porovnáváš objekt s objektem. No a shodné objekty to nejsou. Tzn. je to konzistentní.
Ten 'manuál' si přečti sám :-), vždyť ty ani nevíš co to dělá. Já vím nejen jak, ale i proč to tak funguje a považuji to za velmí špatně vymyšlené a navržené, neznám žádný jazyk, který by se choval hůř než javascript.

Takže 'aa' == 'aa' // true, porovnavam hodnoty
'aa' == new Script('aa') // true, protože přetypování objektu na string
new String('aa') == new String('aa') // false, porovnavam typy
{} == {} // syntax error

Až tak blbý JS je.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #336 kdy: 04. 10. 2018, 23:47:02 »
Citace
new String('aa') == new String('aa')
{} == {}

Tady zase porovnáváš objekt s objektem. No a shodné objekty to nejsou. Tzn. je to konzistentní.

Tady někde je tuším ta hranice, kdy se přepíná mezi porovnávání hodnoty, a porovnávání identity. Což je další matení nepřítele, že si se dvěma oparátory (== a ===) vlastně furt nevystačíš.

Ne, to bych neřekl. Ono totiž není úplně snadné říct, kdy jsou si objekty rovny... :)
Tak proč tedy JS tedy říká, kdy si je objekt roven s primitivním typem? Blbost JS je neobhajitelná a nevysvětlitelná.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #337 kdy: 04. 10. 2018, 23:49:04 »
Teď nevím, co se tím pokoušíš říct...
Máš vysvětlit, proč to JS má navrženo tak blbě a nekonzistentně.

agent

Re:Problémy s JavaScript v praxi
« Odpověď #338 kdy: 05. 10. 2018, 00:15:34 »
Tak proč tedy JS tedy říká, kdy si je objekt roven s primitivním typem? Blbost JS je neobhajitelná a nevysvětlitelná.
Ale JS nic takového neříká.
Všichni kdo JS znají přece vědí, že když se při == porovnávání typy porovnávaných operandů neshodují, tak JS bude AUTOMATICKY přetypovávat jednu ze stran na typ té druhé a porovnávat HODNOTY až po přetypování. A primitivní typy mají samozřejmě přednost před objekty, protože porovnávat dva objekty je nesmysl (vrátí vždy false).
Takže JS pouze říká, že hodnota uvnitř String objektu je shodná s primitivním stringem.
Totéž zapsané explicitně (ruční přetypování + kontrola typu): new String('xx').valueOf() === 'xx'   //true

Pravdu bys měl, kdyby se tak JS choval při použití === kde k přetypování nedojde.

BoneFlute

  • *****
  • 2 046
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #339 kdy: 05. 10. 2018, 01:29:07 »
Ale JS nic takového neříká.
Všichni kdo JS znají přece vědí, že když se při == porovnávání typy porovnávaných operandů neshodují, tak JS bude AUTOMATICKY přetypovávat jednu ze stran na typ té druhé a porovnávat HODNOTY až po přetypování.

Tak oni to tu někteří i vědí. Jen s tím nesouhlasí.


A primitivní typy mají samozřejmě přednost před objekty, protože porovnávat dva objekty je nesmysl (vrátí vždy false).
A proč by mělo být porovnávání dvou objektů nesmysl?

Kód: [Vybrat]
var a = {}
var b = {}
var c = a
a == b // false
a == c // true

eee

Re:Problémy s JavaScript v praxi
« Odpověď #340 kdy: 05. 10. 2018, 05:26:40 »
Tak ja teda neviem... Facebook, Netflix či Uber by podľa vašich kydov nemali vlastne fungovať. Uber už vôbec nie, keďže nepoužívajú vo svojom frameworku TypeScript. Vlastne aj kopec iných mega projektov Fortune500 firiem vlastne nemá fungovať, a ešte ich aj riadia idioti frčiaci na Reacte či Angulare. A programovať vedia len miestne esá. My, ktorí máme radi JS sme vlastne len lopaty, lepiči a pod. Hm. Nejak mi tu však nesedí. Obzvlášť to, že JS seniori sú už lepšie platení ako C# lopaty a siahajú platovo už na Java seniorov. Ale tak asi iba niečo prehliadam. Veď čo ja môžem vedieť s 25 rokmi praxe. Vedia len tí, čo ani len nemajú toľko rokov čo ja tej praxe. Holt, svet patrí mladým... :D:D:D:D
To nikdo nerika, ze by nemely fungovat. Prehlizis to, ze rec je o tom, ze JS je spatne navrzeny jazyk se spoustou problemu, který ale má monopol na webu a kvuli tomu se bohuzel rozsiril. Ale i se spatnym nastrojem lze tvorit, nakonec to tak tady dela kazdy z nas. Ale to neni duvod pro to, abychom ty chyby nepojmenovali.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #341 kdy: 05. 10. 2018, 05:41:32 »
Tak proč tedy JS tedy říká, kdy si je objekt roven s primitivním typem? Blbost JS je neobhajitelná a nevysvětlitelná.
Ale JS nic takového neříká.
Všichni kdo JS znají přece vědí, že když se při == porovnávání typy porovnávaných operandů neshodují, tak JS bude AUTOMATICKY přetypovávat jednu ze stran na typ té druhé a porovnávat HODNOTY až po přetypování. A primitivní typy mají samozřejmě přednost před objekty, protože porovnávat dva objekty je nesmysl (vrátí vždy false).
Takže JS pouze říká, že hodnota uvnitř String objektu je shodná s primitivním stringem.
Totéž zapsané explicitně (ruční přetypování + kontrola typu): new String('xx').valueOf() === 'xx'   //true

Pravdu bys měl, kdyby se tak JS choval při použití === kde k přetypování nedojde.

Ale jo, presne to JS rika. Argument ze neni snadne rict kdy jsou si objekty rovny je klamny.

Kdyz js muze rict, ze jsou si rovny 'aa' a new String('aa'), tak uplne stejne by mohl rict, ze jsou si rovny new String('aa') a new String('aa'). A pokud prijmeme tezi, ze vnitrni stav objektu je slozity a je tezke je porívnavat, pak by melo byt stejne tezke je porovnavat s cimkoliv. Z toho plyne, ze navrh chovani JS je nekonzistentni a proto spatny.

Neexistuje rozumny duvod, proc se v jednom pripade vniřrni hodnota objektu porovnava a v druhem ne. Zrovna tak neexistuje duvod, proc se pri trideni pole ciselntyto vsechny prevedíu na stríngy, zvlaste kdyz se pri normalnim porovhavani stringy prevadi na cisla, je to opet jen vysledek spatneho nekonzistentniho havrhu JS.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #342 kdy: 05. 10. 2018, 06:28:15 »
A primitivní typy mají samozřejmě přednost před objekty, protože porovnávat dva objekty je nesmysl (vrátí vždy false).
Takže JS pouze říká, že hodnota uvnitř String objektu je shodná s primitivním stringem.

Ty rikas jak to je, ale to neni argument na nase tvrzeni, ze je to navrzeno spatne.

Primitivni typy == chybny navrh, cistejsi koncept je mit navenek vsechno je objekt, pak nebudes mit primitivni a objektove stringy. Syntaxe 'neco' by mel byt jennsyntakticky cukr pro zapis new String('neco'). JS tonproste dela blbe.

Porovnavat dva objekty je nesmysl pouze v JS v dusledku jeho spatneho navrhu. Nemoznost porovnat dva objekty je stejne inteligentni jako nemoznost porovnat dva jednoduche promenne (coz v nekterych jazycich je ostatne jedno a to same). V rozumne navrzenych jazycich si to proto muzes lehce zaridit i u vlastnich objektu/datovych typu.

Kód: [Vybrat]
bash-4.4$ cat cmpobj.py
class Obj(object):
    def __init__(self, data=None):
        self.data = data
    def __eq__(self, other):
        if isinstance(other, Obj):
            return self.data == other.data
        return False


a = Obj()
b = Obj()
c = Obj('aa')
d = Obj('aa')
e = Obj('bb')
bash-4.4$ python -i cmpobj.py
>>> a == a
True
>>> a == b
True
>>> a is a
True
>>> a is b
False
>>> c == d
True
>>> c == e
False
>>>

Vidis? Zadny problem pri porovnani objektu, je to konzistentni, predvidatelne a prehledne. A dle stejnych pravidel se to zachova i pri serazeni v poli, nema to jina nekonzistentni pravidla. Stejne tak si mohu jednoznacne zvolit, zda chci porovnat hodnotu nebo identitu. Tak vypada kvalitni navrh jazyka.

Ano, pouziti == v JS znamena, ze se nekdy porovnavaji typy a nekdy hodnoty, tj nekdy ma == stejny vyznam jako === a nekdy ne. Dalsi príklad spatneho nekonzistentniho navrhu.

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #343 kdy: 05. 10. 2018, 11:24:35 »
K původnímu tématu a specificky k již zmíněnému stupidnímu návrhu async/await: http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/

Re:Problémy s JavaScript v praxi
« Odpověď #344 kdy: 05. 10. 2018, 11:27:50 »
Môže mi niekto napísať nekonzistentnosti v návrhu JS od verzie ES5? Lebo kritici sa tu ako slamky chytajú len problémov ktoré sú staré snáď 20 rokov a boli zanechané len kvôli spätnej kompatibilite, aby aj 15 ročná stránka so "super DHTML efektami" fungovala aj dnes, čo však neznamená, že máte JS aj dnes používať takým spôsobom. Preto keď už, ukážte zlý návrh vo verzii ES5 a vyššie, v modernom JS. Vopred vďaka za vaše postrehy.