Lasst uns Versuchen Sie um es einfach zu halten und zu erörtern, wie es tatsächlich funktioniert. Es hat mit Variablentypen und Funktionsparametern zu tun.
Hier ist Ihr Code, über den wir sprechen:
var arr = ["one","two","three"];
arr.forEach(function(part) {
part = "four";
return "four";
})
alert(arr);
Zunächst einmal sollten Sie sich hier über Array.prototype.forEach() informieren:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Zweitens, lassen Sie uns kurz über Werttypen in JavaScript sprechen.
Primitive (undefiniert, null, String, Boolean, Zahl) einen aktuellen Wert speichern.
ex: var x = 5;
Referenztypen (benutzerdefinierte Objekte) speichern den Speicherort des Objekts.
ex: var xObj = { x : 5 };
Und drittens, wie Funktionsparameter funktionieren.
In Funktionen sind Parameter immer nach Wert übergeben.
Denn arr
ist ein Array von Strings, es ist ein Array von primitiv Objekte, d.h. sie werden nach Wert gespeichert.
Für Ihren obigen Code bedeutet dies also, dass jedes Mal, wenn die forEach() iteriert, part
entspricht dem gleichen Wert wie arr[index]
, aber nicht das gleiche Objekt .
part = "four";
wird die part
variabel, lässt aber arr
allein.
Mit dem folgenden Code können Sie die gewünschten Werte ändern:
var arr = ["one","two","three"];
arr.forEach(function(part, index) {
arr[index] = "four";
});
alert(arr);
Wenn nun Array arr
war eine Reihe von Referenztypen Der folgende Code funktioniert, weil Referenztypen einen Speicherplatz eines Objekts anstelle des eigentlichen Objekts speichern.
var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
arr.forEach(function(part, index) {
// part and arr[index] point to the same object
// so changing the object that part points to changes the object that arr[index] points to
part.num = "four";
});
alert(arr[0].num);
alert(arr[1].num);
alert(arr[2].num);
Die folgende Abbildung zeigt, dass Sie Folgendes ändern können part
auf ein neues Objekt verweisen, während die Objekte, die in arr
allein:
var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
arr.forEach(function(part, index) {
// the following will not change the object that arr[index] points to because part now points at a new object
part = 5;
});
alert(arr[0].num);
alert(arr[1].num);
alert(arr[2].num);