ugrás a tartalomhoz

JavaScript “Associative Arrays” Considered Harmful

wiktor · 2006. Május. 23. (K), 07.05
Object-et használjunk "asszociatív tömbökhöz" JavaScriptben.
 
1

A cím ROSSZ

Bártházi András · 2006. Május. 23. (K), 07.06
Semmi baj az asszociatív tömbökkel JavaScriptben, csak éppen nem az Array()-t kell használni hozzá. Van olyan, aki azt használta??
2

Ajaxian

ralesk · 2006. Május. 23. (K), 09.38
Legalább is az Ajaxian szerint van :) Mondjuk én is elcsodálkoztam, miért ezt a címet adták neki, de biztos csak Dijkstrát akarják majmolni, csak nem sikerült.
3

Nincs aszociatív tömb JavaScriptben

Jano · 2006. Május. 23. (K), 10.46
Ez a cikk így hülyeség. JavaScriptben egyszerüen nincs olyan, hogy "asszociatív tömb". Van egy szintaktikus jelölés: valami["akarmi"] ami hasonlít más programnyelvek aszociatív tömb kezeléséhez, de valójában ez JavaScriptben az objektumok tulajdonságainak elérésének egy módja. Ugyanaz mintha: valami.akarmi-t írnánk.
4

nincs olyan, hogy "asszociatív tömb"

Balogh Tibor · 2006. Május. 23. (K), 11.40
Tehát valójában a következő kódnál:
a["egy_név"] = 1;
nem egy tömbérték jön létre, hanem az Array objektum - a már példányosított Array osztály - egy tulajdonsága?
5

Pontosan

Bártházi András · 2006. Május. 23. (K), 14.00
Ez így valószínűleg nem fog menni, az a változónak előtte egy bármilyen típusú objektumnak kell lennie. Másrészt pedig pont arról szól a cikk, hogy ne az Array-t használjuk erre a célra, hanem az alap Object-et. A lényege a dolognak, hogy bármely példányosított objektumon, típustól függetlenül működik a fenti jelölés és használat, csak hülyeség nem az Object-et használni erre a célra.

Helyes példa:
var a = {};
a["bármi jöhet ide"] = 1;
a.akarmi = 2;
Vagy másképp:
var a = new Object();
a["bármi jöhet ide"] = 1;
a.akarmi = 2;
De a két példa gyakorlatilag ugyanaz.
6

Két megjegyzés

Balogh Tibor · 2006. Május. 23. (K), 15.49
1.) Egy másik szintaktikai javaslat, hátha ez szimpatikusabb:
var a = {
	akármi:  2,
	bármi:  12,
	izé:     3
};

a["izé"] = a["bármi"] + a["akármi"];
2.) Ezek szerint több dimenziós tömb sincs javascriptben, csak olyan vektor, aminek a tagjai tömb objektumok?

3.) Igen, lemaradt egy sor:

var a = new Array();
a["egy_név"] = 1;
7

Mit ír ki?

Jano · 2006. Május. 23. (K), 16.47

var a = {
    akármi:  2,
    bármi:  function () {
      var i; 
      for (i in this) alert(i + " " + typeof this[i])
    },
    izé:     [1,["2a","2b"],3]
};

a.bármi();
alert(a.izé[1][1]);
10

Mit ír ki?

Balogh Tibor · 2006. Május. 23. (K), 18.27
Ránézésre ezt:

akármi integer
bármi function
izé Array
2b
11

"mitirki"

Jano · 2006. Május. 23. (K), 19.01
Háttér:
A "mitirki" BME-n Pongor tanárúr egyik bevett vizsga kérdése volt, természetesen mindig valami kis trükkel megcsavarva ami feltételezte, hogy pontosan tudja a hallgató, hogy mi is történik a kód értelmezésekor.

A kód inkább csak válasz volt a másik bejegyzésre, példát mutatva arra, hogy nem csak attribútumokat, de metódusokat is lehet definiálni ezzel az egyszerű szintaktikával.

Az izé tömb megadása pedig a többdimenziós tömb kérdésre akart válasz lenni.

Akit érdekel mit ír ki, futassa le és meglátja.
8

NENENE

Bártházi András · 2006. Május. 23. (K), 17.00
A 3)-as megoldást ne is reklámozzuk, mert ROSSZ.

Az 1) egy másik lehetséges deklarációt mutat be.

A JavaScriptben minden objektum. Objektumnak lehet tulajdonsága egy másik objektum. Egy tömb típusú objektumnak lehet eleme akár egy tömb, akár valami teljesen más objektum. Olyan, hogy vektor, és olyan, hogy többdimenziós tömb, olyan nincs, viszont a működésének következtében teljesen olyan, mintha lenne többdimenziós tömb. Tehát nyelvi szinten deklaráltan nincs, de amúgy van. ;)
9

nem reklám volt

Balogh Tibor · 2006. Május. 23. (K), 18.23
1.) Nem reklám volt, hanem válasz erre:
Ez így valószínűleg nem fog menni...

2.) Az azért barokkos túlzás azt állítani, hogy a javascriptben minden objektum. Ennyire nem objektumorientált nyelv. :)
12

folyt

Jano · 2006. Május. 23. (K), 19.07
Fenti példát folytatva:

Ez működik. (Itt egy függvénynek adunk attribútumot.)

a.bármi["leírás"] = "Ez a metódus 'bármi' névre hallgat.";
alert(a.bármi["leírás"]);
Ez már nem: (Egy Number objektumnak)

a.akármi["betűvel"] =  "Kettő";
alert(a.akármi["betűvel"]);
Pedig ez is objektum. Van .value attribútuma, .toString() metódusa...
13

Minden objektum

Bártházi András · 2006. Május. 23. (K), 20.31
Miért, mi az, ami nem objektum? Nyilván a for kulcsszó nem az, de minden létrejövő dolog a változóktól a függvényeken át a böngésző (például) beépített elemein át valóban objektum. A JavaScript kiemelkedően objektum-orientált nyelv.
14

objektumorientált?

Balogh Tibor · 2006. Jún. 7. (Sze), 19.14
A JavaScript kiemelkedően objektum-orientált nyelv.

Inkább objektum alapú, vagy ilyesmi.
Lehet, hogy a js-ben minden objektum, de nem követeli meg, hogy objektumorientáltan programozz. Ugye nem attól lesz valamelyik kód oo, hogy a változók objektumok, és a függvények a window objektumhoz tartoznak? Így a fenti mondatot erre módosítanám: "Barokkos túlzás a js-et kiemelkedően objektum-orientált nyelvnek hívni."

De erősen objektum alapú.