Toon posts:

[JS] Onverwacht gedrag Array's

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met JavaScript en dan met Array's. Voor mijn stack-based
parser gebruik ik 2 array's. 1 voor het analyseren en 1 om gegevens later weer
in de stack te plaatsen.
Ik kwam tot de conclusie dat JS zich soms vreemd gedraagt en ik kan niet nagaan
waarom. Neem het volgende versimpelde voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
var a = new Array();
a[0] = new Array();
a[0]['foo'] = 10;

var b = new Array();
b[0] = a[0]

var c = new Array();
c[0] = a[0];

b[0]['foo'] = 11;

alert(c[0]['foo']);
</script>

In de voorlaatste regel zet ik de varabele b[0]['foo'] op 11. In de laatste
regel alert ik de waarde: c[0]['foo']. Je zou verwachten dat die nog steeds
de waarde 10 heeft. Maar vreemd genoeg heeft die waarde 11.

Iemand enig idee? Of is dit een bug in JS?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 11:43

crisp

Devver

Pixelated

op het moment dat je een object toekent aan een variabele (een Array is ook een object), dan wordt er geen kopie gemaakt, maar een referentie

Intentionally left blank


Verwijderd

Topicstarter
Zoiets vermoedde ik al. Zeker niet te omzeilen? Kan ik geen variabelen
kopieren ByValue?

[ Voor 31% gewijzigd door Verwijderd op 20-01-2004 19:53 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 11:43

crisp

Devver

Pixelated

Verwijderd schreef op 20 januari 2004 @ 19:53:
Zoiets vermoedde ik al. Zeker niet te omzeilen? Kan ik geen variabelen
kopieren ByValue?
Je zou je eigen method kunnen appenden aan het Array object mbv prototyping; een clone() method ofzo. JS heeft daar default geen methods voor.

Intentionally left blank


Verwijderd

Topicstarter
Prototype om een Array te klonen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * Prototype: Array.clone();
 * 
 * Retouneert een gekloonde Array in plaats van een referentie.
 *
 * @author Jorgen Horstink <jorgen@nextavenue.com>
 */
Array.prototype.clone = __prototype_array_clone;
function __prototype_array_clone() {
  var temp = [];
  for(var i in this) {
    if (typeof this[i] == "object") {
      temp[i] = this[i].clone();
    } else {
      temp[i] = this[i];
    }
  }
  return temp;
}

[ Voor 24% gewijzigd door Verwijderd op 21-01-2004 11:12 . Reden: Blues reactie ]


Verwijderd

JavaScript:
1
2
3
4
5
temp[i] = array_clone(obj[i]);
// moet dat niet:

temp[i] = obj[i].clone();
//zijn?
Pagina: 1