Hallo Robert,
- Lege das Objekt sps_datenpunktliste neu als String an.
- Erweitere den String um das Attribut mit dem Namen, der in aktiver_spsname steht und weise diesem den String aus zeile.spsvarname zu.
Das ist eine beliebte Falle, in die man bei JavaScript tappen kann. Ein String ist ein primitiver Typ, kein Objekt.
let a = "Hallo";
console.log(typeof a);
// "string"
Da müsste "object" stehen, wenn a ein Objekt wäre. Verwendet man einen primitiven Typ wie ein Objekt, findet etwas statt, was in anderen Sprachen "boxing" genannt wird: der primitive Wert wird in ein Objekt eingekapselt. In diesem Fall: String (großes s). Auf diesem Objekt wird die objektorientierte Aktion ausgeführt, danach wird das Objekt wieder entfernt.
Dieser Code
let a = "Hallo";
a.who = "Welt";
console.log(a.who);
weist dem String "Hallo" keine Eigenschaft who zu. Das wäre fatal, weil Strings unveränderlich sind und von der JS Engine internalisiert werden (heißt: Steht dreimal "Hallo" im Code, gibt's diesen String tatsächlich nur einmal. Würde man ihm Eigenschaften zuweisen können, würde sich diese Änderung auf jede Stelle auswirken, wo "Hallo" irgendwohin zugewiesen wird).
Was in Wahrheit passiert, ist:
let a = "Hallo";
const __tempString = new String(a);
__tempString.who = "Welt";
console.log(a.who); // undefined
Und ja, das passiert auch beim Anwenden von Stringmethoden!
let a = "Hallo";
console.log(a.substring(0,1) + a.substring(4,5)); // "Ho"
ist in Wahrheit
let a = "Hallo";
const __tempString1 = new String(a);
const __tempResult1 = __tempString1.substring(0,1);
const __tempString2 = new String(a);
const __tempResult2 = __tempString2.substring(4,5);
console.log(__tempResult1 + __tempResult2);
Wobei eine ordentliche JS-Engine erkennen sollte, dass sie hier mit einem Temp-String auskommt. Andererseits kann so eine Optimierung auch gefährlich enden, die Engine muss also SEHR gut sein, um Fälle wie diesen hier richtig zu behandeln:
// Nicht nachmachen!
let a = "Hallo";
function setA(val) {
a = val;
return "*";
}
console.log(a.substring(0,1)+setA("Wonka")+a.substring(4,5));
Welches Ergebnis würdest Du erwarten? "H*o"
oder "H*a"
?
Rolf
sumpsi - posui - obstruxi