Autor | Zpráva | ||
---|---|---|---|
hypot Profil |
#1 · Zasláno: 11. 1. 2019, 14:31:01
Několik jednoduchých proměnných se stejnou výchozí (počáteční) hodnotou lze vytvořit například takto:
var promenna1 = promenna2 = 0 Na základě výše zmíněného by se dalo dovodit, že stejným způsobem se dá vytvořit i několik prázdných polí (což jsou rovněž proměnné): var pole1 = pole2 = [] Jistě bych se mohl spokojit s tím, že víc prázdných polí nelze vytvořit uvedeným způsobem, a v praxi by to stačilo. Mě nicméně zajímá důvod tohoto rozdílu. Proč se pole vytvořená stejným způsobem jako jednoduché proměnné chovají jinak? |
||
Mlocik97 Profil |
protoze u plo sa predava reference na zaciatok pola resp. na prvy prvok pola, nikoliv hodnota vsech prvku pola. Samozrejme su aj moznosti ako pole naklonovat.
|
||
Radek9 Profil |
hypot:
„Několik jednoduchých proměnných se stejnou výchozí (počáteční) hodnotou lze vytvořit například takto:“ Už tady je to špatně. Proměnná se definuje příkazy var , let nebo const . Pokud to definuješ tak, jak jsi to napsal, tak definuješ pouze proměnnou promenna1 . Proměnná promenna2 je v tu chvíli mimo příkaz a je definována jako globální proměnná, což ve většině případů nechceš.
Příkaz var promenna1 = 0; se dá ve skutečnosti rozepsat takto:
var promenna1; promenna1 = 0; V tvém případě se tedy provede následující: var promenna1; promenna2 = 0; // Vzhledem k tomu, že nebyla proměnná definovaná pomocí jednoho z uvedených příkazů, je globální promenna1 = promenna2; Správně je to tedy takto: var promenna1, promenna2; promenna1 = promenna2 = 0; nebo: var promenna1 = 0, promenna2 = 0; „Na základě výše zmíněného by se dalo dovodit, že stejným způsobem se dá vytvořit i několik prázdných polí (což jsou rovněž proměnné):“ Tady je podstatné si uvděomit, že je zásadní rozdíl mezi primitivními hodnotami (čísla, řetězce, booly) a objekty. Primitivní hodnoty se v JS předávají napřímo. Pokud tedy uložíš do dvou proměnných stejnou primitivní hodnotu, tak se nakopíruje. Pole je ale objekt. A objekty jsou v JS předávány pomocí reference. Pokud to uděláš tak, jak jsi to napsal (na chybu s nevyžádanou globální proměnnou jsem již upozornil), tak obě proměnné odkazují (tedy obsahují stejnou referenci) na totožný objekt. Kopíruje se tedy jen reference (odkaz), ale nikoli již příslušný objekt. Správně je tedy toto řešení: var promenna1 = [], promenna2 = []; // Proměnné obsahují reference na 2 různé objekty |
||
Kcko Profil |
#4 · Zasláno: 11. 1. 2019, 20:57:05
hypot:
Tohle chování má PHP, ne JS. |
||
TomášK. Profil * |
#5 · Zasláno: 12. 1. 2019, 21:31:44
Kcko:
Javascript také. var a = b = []; a.push(42); console.log(b); //Array [ 42 ] |
||
_es Profil |
#6 · Zasláno: 12. 1. 2019, 21:35:36
Radek9:
„Proměnná promenna2 je v tu chvíli mimo příkaz a je definována jako globální proměnná, což ve většině případů nechceš.“
To nie je celkom správny popis, promenna2 nie je v tom prípade definovaná ako globálna premenná, ale len ako vlastnosť "promenna2" globálneho objektu, čo nie je to isté. Napríklad operátor delete dokáže odstrániť "premennú" promenna2 no nie premennú promenna1 . Ak by bol použitý "striktný mód", tak hypotov príkaz vyvolá chybu.
|
||
Keeehi Profil |
#7 · Zasláno: 13. 1. 2019, 00:48:00
TomášK.:
Kcko ovšem částí "Tohle chování" měl samozřejmě na mysli chování hypotem předpokládané, že přiřazením pole vzniká v PHP jeho kopie. Příště si prosím nejdříve pořádně přečti co pisatel píše a hlavně popřemýšlej, co tím myslí. |
||
TomášK. Profil * |
#8 · Zasláno: 13. 1. 2019, 01:23:27
Keeehi:
Dík, zdálo se mi, že něco nesedí – leželo to tu poměrně dlouho a nikdo se neozval. Nenapadlo mě, že se php dělá kopie, předpokládal jsem, že se chová stejně jako javascript, python nebo ruby a předává jen odkaz na pole. |
||
Radek9 Profil |
#9 · Zasláno: 13. 1. 2019, 17:07:04
_es:
Máš samozřejmě pravdu, hodně jsem pro účely téhle ukázky zjednodušoval. Použití strict modu většinu podobných problémů řeší. |
||
Časová prodleva: 4 roky
|
0