Autor | Zpráva | ||
---|---|---|---|
_es Profil |
joe:
„Takže v tomto případě třeba zavedeš prefix dolar a v jiných ne? To mi také nezní moc logicky. Proč dělat vyjímky jen v tomto případě?“ Pretože ide o dve premenné s príbuzným obsahom, ktoré treba aj vhodne odlíšiť aj zvýrazniť, že nejako patria k sebe, pre jednu premennú je ten prefix akosi nadbytočný. „Nebudu přeci nastavovat proměnné nedefinovanou hodnotu, když ji definuji :-)“ Ale definícia premennej a zadanie jej hodnoty sú dve odlišné veci: var x; // premenná x je definovaná x = 1; // premennej x je nastavená hodnota na 1 var y = 2; // premenná y je najprv definovaná a potom nastavená na hodnotu 2 var x; // premenná x je (re)definovaná - má hodnotu 1 > Když to přeložíme: > null - nulová hodnota > undefined - nedefinovaná hodnota Možno lingvisticky, ale nulová hodnota je 0 , null a undefined sú JS hodnoty špeciálneho typu, undefined je hodnota definovanej premennej, ktorej nebola priradená hodnota. Otázne je, prečo by mala byť „nulová“ hodnota objekt.
> protože pokud je null, jedná se o objekt: > typeof(null) === "object" // je pravda (opraveno) No a to je možnosť ďalších komplikácií - viď príspevok Jokera. „co je originální objekt Window a co je obalený objekt Window funkcí jQuery?“ Pre zaujímavosť, objekt Window a objekt window sú odlišné veci (v mnohých prehliadačoch). To je príklad rozumného použitia rozlíšenia veľkosti písmen pre príbuzné objekty - podobne ako pri prefixe.
|
||
joe Profil |
#2 · Zasláno: 23. 10. 2012, 20:51:14 · Upravil/a: joe
_es:
„Pretože ide o dve premenné s príbuzným obsahom, ktoré treba aj vhodne odlíšiť aj zvýrazniť, že nejako patria k sebe, pre jednu premennú je ten prefix akosi nadbytočný.“ Vždy jde o dvě proměnné. Buď o "klasický" element / pole elementů a nebo element / pole elementů obalené jQuery. Kdykoli se mohu rozhodnout přistupovat k původnímu elementu, měl bych potom zpětně zase proměnné přejmenovávat a nasazovat prefix, protože zrovna v tu dobu bych to tak potřeboval? Př.: $("a").each(function () { var link = $(this); // nějaký kód specifický pro každý procházený odkaz (proto nemohu aplikovat na celou kolekci odkazů link.click(function () { // tady chci mít k dispozici jQuery objekt a originální objekt, který v tuto chvíli představuje this console.log("original", this); console.log("jQuery", link); }); link.parent("...").click(function () { // tady chci mít k dispozici jQuery objekt a originální objekt (odkaz, ne jeho rodiče), který v tuto chvíli představuje this console.log("jQuery", link); console.log("original", ...); // tady co? Musím si originální this uložit do proměnné, jak ji nazvu? self? that? me? Pak ale nebude jasné, co v ní je. // můžu taky přistupovat k originálu přes link.get(0), musím si ale být jistý, že jQuery neobsahuje kolekci elementů, ale právě jeden (což v tomto případě je pravda, ale jinde by to mohlo dělat problémy) }); }); s prefixem dolaru není problém: $("a").each(function () { var link = this, $link = $(link); // jednoznačně odlišené co je a co není jQuery // nějaký kód specifický pro každý procházený odkaz (proto nemohu aplikovat na celou kolekci odkazů link.click(function () { // tady chci mít k dispozici jQuery objekt a originální objekt, který v tuto chvíli představuje this console.log("original", link); console.log("jQuery", $link); }); link.parent("...").click(function () { // tady chci mít k dispozici jQuery objekt a originální objekt (odkaz, ne jeho rodiče), který v tuto chvíli představuje this console.log("jQuery", $link); console.log("original", link); }); }); „Ale definícia premennej a zadanie jej hodnoty sú dve odlišné veci:“ Ano, myslel jsem spíš toto var x = undefined; // deklaruju proměnnou x na nedefinovanou hodnotu var x; , ale u těch objektů mě to nutí za dvojtečku něco napsat, tak proč právě undefined ? Proč bych někde měl mít undefined a jinde null ? Proč ne všude stejně._es: „Pre zaujímavosť, objekt Window a objekt window“ Má být malé "w", pardon :) |
||
_es Profil |
#3 · Zasláno: 23. 10. 2012, 21:11:54
joe:
„Má být malé "w", pardon :)“ To nie je tak jasné, na zmätenie treba v rôznych prehliadačoch skúsiť alert(window) .
> var x = undefined; // deklaruju proměnnou x na nedefinovanou hodnotu > A to mi nepřijde moc logické, v tomto případě jde zapsat jen var x; Tak prečo tie „nelogické“ príkazy stále podsúvaš? „Proč bych někde měl mít undefined a jinde null? Proč ne všude stejně.“ Prečo by som mal „nasilu“ potláčať použitie hodnoty undefined a namiesto nej „nasilu“ dávať hodnotu null - len s výslednými komplikáciami?
|
||
joe Profil |
#4 · Zasláno: 23. 10. 2012, 21:25:21
_es:
„Tak prečo tie ‚nelogické‘ príkazy stále podsúvaš?“ To jsem nebyl já, kdo se divil, že přiřazuji proměnným null .
„Prečo by som mal ‚nasilu‘ potláčať použitie hodnoty undefined a namiesto nej ‚nasilu‘ dávať hodnotu null - len s výslednými komplikáciami?“ Nevidím komplikace. Protože pokud funkce má vracet objekt, vrátí ho a nebo vrátí null , proč by měla vracet undefined , jen protože to tak v JavaScriptu je?
Držme se tématu, vyhnul jsi se odpovědi ke kódu :-) |
||
_es Profil |
#5 · Zasláno: 23. 10. 2012, 21:50:13
joe:
„vyhnul jsi se odpovědi ke kódu“ Je neefektívny, pre každý odkaz sú vyrábané dve funkcie a kde sa podela konvencia „ $this “ - je to nejaká nejednoznačná konvencia.
„Nevidím komplikace. Protože pokud funkce má vracet objekt, vrátí ho a nebo vrátí null, proč by měla vracet undefined, jen protože to tak v JavaScriptu je?“ Aká funkcia? Aký objekt? Reč bola len o definícii premennej a jej hodnote. Prečo mám nastavovať explicitne premennej hodnotu null , považovanú pri niektorých výrazoch za objekt, čo môže byť zdrojom komplikácií, keď ju trebárs neskôr chcem používať s číselnými hodnotami?
|
||
joe Profil |
#6 · Zasláno: 23. 10. 2012, 23:43:21
_es:
„Je neefektívny“ To v tuto chvíli není vůbec podstatné, důležité je to, že mám rozlišené jQuery a nonJQuery objekt jen pomocí jediného znaku - $ - a nemusím vymýšlet další ne moc jasné názvy proměnných.
„Aká funkcia? Aký objekt? Reč bola len o definícii premennej a jej hodnote. Prečo mám nastavovať explicitne premennej hodnotu null, považovanú pri niektorých výrazoch za objekt, čo môže byť zdrojom komplikácií, keď ju trebárs neskôr chcem používať s číselnými hodnotami?“ Myslím, že jsem psal, že ji používám/snažím se pokud má být v proměné objekt nebo ne. Tzn. že pokud mi typeof vrátí, že null je objekt, nic se neděje a je to očekávané chování.
|
||
_es Profil |
#7 · Zasláno: 24. 10. 2012, 00:23:45
joe:
„Myslím, že jsem psal, že ji používám/snažím se pokud má být v proměné objekt nebo ne.“ Tak teda tam ten objekt byť má alebo nemá? Tak kedy ju nepoužívaš, lebo prekrucuješ, čo si sám písal: „Pokud si definuju proměnnou, nastavuju ji na null, psát undefined mi přijde dlouhé a zbytečné, ale možná že se to k něčemu (kromě ověřování, zda proměnná existuje) hodí.“ (#2/19) Čo teda dávaš do premennej, v ktorej nemusí byť objekt a bude jej priradená nejaká užitočná hodnota až neskôr, aby „si nemusel písať undefined“, lebo to vyzerá, že undefined si sám sebe zakázal? Čo dávaš v rovnakom prípade do premennej, v ktorej má byť „objekt jQuery“? Ak null , tak máš po konvencii s prefixom, lebo null nie je jQuery objekt.
|
||
joe Profil |
#8 · Zasláno: 24. 10. 2012, 00:46:27
_es:
„Čo teda dávaš do premennej, v ktorej nemusí byť objekt a bude jej priradená nejaká užitočná hodnota až neskôr“ Snažím se vycházet z toho, že proměnná má nějakou výchozí hodnotu... Pokud boolean, výchozí si dám třeba false, pokud objekt, výchozí null, pokud int, výchozí 0, atp. „Čo dávaš v rovnakom prípade do premennej, v ktorej má byť ‚objekt jQuery‘?“ Víceméně nic, protože vytvářím proměnné až když jsou potřeba. „Ak null, tak máš po konvencii s prefixom, lebo null nie je jQuery objekt.“ Není jQuery, ale je normální objekt. A to se nevylučuje. V kódu bych tedy někde klidně mohl mít var $el = this.find("el"); ... $el = null; ... if ($el !== null) { ... } |
||
_es Profil |
joe:
„Pokud boolean, výchozí si dám třeba false, pokud objekt, výchozí null, pokud int, výchozí 0, atp.“ Teda je tam vlastne len nadbytočný kód na nastavenie východzej hodnoty a užitočná hodnota je zadaná až neskôr. Na čo? „Víceméně nic, protože vytvářím proměnné až když jsou potřeba.“ Teda vo funkcii napríklad uprostred funkcie? To nie je veľmi praktické, aby neboli všetky premenné definované na začiatku funkcie. Ono sú premenné aj tak vytvorené už od začiatku funkcie - bez ohľadu na to, kde sa ich definícia nachádza. „Není jQuery, ale je normální objekt.“ Null nie je „normálny“ objekt, nemá ani konštruktor ako všetky ostatné objekty. Ohľadom toho, aký máš prehľad, čo môže byť v akej premennej a ohľadom tej hodnoty null - čo získaš, ak sa pokúsiš získať prvý objekt DOM z objektu jQuery, ktorý neobsahuje ani jeden element? Napríklad posledný kód v 1/22. Tvorci jQuery asi tvoju konvenciu o null veľmi neobľubujú a na tie testy na null sa veľmi spoľahnúť nemôžeš.
|
||
joe Profil |
#10 · Zasláno: 24. 10. 2012, 02:08:17
_es:
„Teda je tam vlastne len nadbytočný kód na nastavenie východzej hodnoty a užitočná hodnota je zadaná až neskôr.“ Píšeš ty. Užitečná hodnota je dle mě hned na začátku, protože je výchozí. A pokud píšu funkci, která vrací boolean (takže nic jiného než true / false nemůže vracet), určím si výchozí hodnotu na proměnné, kterou pak z funkce vracím. Nemůže se mi tedy stát, že bych vrátil stavy tři - true | false | undefined , což se v případě neurčení výchozí hodnoty může stát lehce:
function isXyz (s) { var ret; if (...) { ret = true; } return ret; } „Tvorci jQuery asi tvoju konvenciu o null veľmi neobľubujú“ Je to "můj" způsob, mně se líbí a přijde mi čistější a nenutím ho nikomu. Nevidím ale důvod rozlišovat o jeden "stav", undefined , navíc.
„a na tie testy na null sa veľmi spoľahnúť nemôžeš.“ Protože mám jQuery objekty rozlišené dolarem a vím, že jQuery funkce vrací pole, musím testovat velikost pole, abych zjistil jestli nějaký element obsahuje. Tzn., že z kódu na který odkazuješ, pokud bych to chtěl napsat blbuvzdorně, udělal bych to nějak takto: var $foo = $("foo"); if ($foo.length) { var foo = $foo.get(0); } jQuery taky pořád vrací kolekci z důvodu, abych se té podmínky vyhnul (pokud nebudu chtít pracovat s originálním elementem), neskončí to žádnou chybou. Zápis je sice kratší, ale zase může vést k nečemu, co neočekáváme (například chyba v selectoru) a kód bude pokračovat jakoby nic. |
||
_es Profil |
joe:
„A pokud píšu funkci, která...“ A čo premenná, ktorej hodnota z funkcie nie je vrátená? Tam je nadbytočné priradenie hodnoty k čomu? Tiež len podobná samoúčelnosť ako s tým prefixom?: Priradím si do premennej niečo skôr než treba, aby som „videl“, čo v nej má byť? „musím testovat velikost pole, abych zjistil jestli nějaký element obsahuje.“ Nemusíš, stačí overiť, či má objektJQuery[0] či objektJQuery.get(0) hodnotu undefined alebo aj netestovať nič a vedieť aké výrazy s hodnotou undefined vyvolajú výnimku.
„Nemůže se mi tedy stát, že bych vrátil stavy tři - true | false | undefined, což se v případě neurčení výchozí hodnoty může stát lehce:“ Ľahko sa ti to môže stať aj pri „východzej hodnote“ - stačí, aby bol príkaz return nejako preskočený a funkcia vráti hodnotu undefined . No ak aj nie, je tento prístup zdrojom možného omylu: Čo ak je hodnota false aj true výsledkom nejakého výpočtu - potom je je bezdôvodné vrátenie východzej hodnoty chybné.
„Nevidím ale důvod rozlišovat o jeden "stav", undefined, navíc.“ Dôvod je jednoduchý: Ten „stav“ sa v kóde nachádza: neexistujúca vlastnosť objektu, návratová hodnota funkcie bez return u, ...
|
||
Joker Profil |
Tady toho nějak přibylo :) Nečetl jsem detailně všechny nové příspěvky, ale:
joe: > „Když se ke kódu vracím třeba po půl roce, stejně si projdu, co vlastně dělá. Pro jistotu.“ > Možná kdybys měl nějaký systém, nemusel bys ho tolik procházet ;-) Musel stejně, přece nechci (jen) názvy a typy proměnných, ale vědět, co ten kód přesně dělá. > Ano, máš pravdu, ale ten příklad se mi moc nelíbí a chybí mi tam jedna podmínka, která by do tebou uvedeného stavu proměnnou nikdy nedostala: > if(typeof(mujObjekt) === "object" && typeof(mujObjekt.bar) !== "undefined") foo = mujObjekt.bar; Z toho je myslím pěkně vidět, že to nezjednoduší práci, ale naopak práci přidělá. Ani tohle nevyloučí všechny neplatné hodnoty. Ve foo pořád může být NaN, nebo jiný datový typ než chci, a tak podobně. Čili pak stejně ty neplatné hodnoty odfiltruji něčím jako třeba if (foo) nebo if (foo > 0) nebo něco takového a jediný rozdíl je, že tady si musím důsledně hlídat, aby se mi tam někudy nedostal undefined.
„S objekty to má takovou souvislost, protože pokud je null, jedná se o objekt“ Takže by většinou byl lepší spíš opačný přístup, snažit se eliminovat null a používat jen undefined, protože se pak ta „prázdná“ hodnota lépe pozná (undefined je undefined, zatímco null je objekt). > „Ak null, tak máš po konvencii s prefixom, lebo null nie je jQuery objekt.“ > Není jQuery, ale je normální objekt. A to se nevylučuje. No moment, třeba {"foo":"bar"} je taky normální objekt, může tedy být v dolarové proměnné?
Já měl za to, že smysl toho prefixování je, že jakmile vidím dolar, přestanu o tom přemýšlet a automaticky předpokládám jQuery objekt. Jestli to může být jQuery nebo null, nemůžu si být jistý, že to je jQuery objekt a jsem zase na začátku. Ještě dodatek k [#10]: „A pokud píšu funkci, která vrací boolean (takže nic jiného než true / false nemůže vracet)“ Tak ji samozřejmě musím napsat tak, aby nic jiného nevracela. Ovšem to je úplně jiná situace. Souhlasím s tím, že pokud píšu funkci, která za určitých podmínek vrací třeba nějaký objekt a jinak null, dává smysl si do proměnné s výsledkem na začátku dát null. Z toho ale pořád nevyplývá, že by se měla vždycky každá proměnná inicializovat na null. |
||
Časová prodleva: 12 let
|
0