Wert zugewiesen primitive verloren
Wenn ich ein array von Objekten und eine Schleife Zuweisung eines Wertes an ein Attribut für jeden, WebStorm warnt mich:
Werte zugewiesen primitive verloren
Jedoch beim testen in der Konsole, die ich nicht "verlieren" keine Werte.
Dies geschieht nur, wenn die Schleife innerhalb einer Funktion.
Ein Beispiel für diesen Fehler unten:
let people = [
{
name: 'Foo',
age: 21,
surname: 'FooBar'
},
{
name: 'Bar',
age: 51,
surname: 'FooBar'
}
];
Ohne Funktion-wrapper:
people.forEach(function (person) {
person.surname = 'Baz'; //No error. Works in console.
});
Mit der Funktion wrapper:
function changeSurname(people) {
people.forEach(function (person) {
person.surname = 'Baz'; //Error warning me that value assigned to primitive will be lost.
});
}
changeSurname(people);
Beide erzeugen die gleiche Ausgabe in der Konsole (der Nachname wird geändert, um die 'baz').
Ich nehme an, dies hat etwas zu tun mit der Objekt-Referenz und was person
Punkte, aber ich bin nicht sicher, was genau.
Warum sehe ich diese Fehler?
Welche möglichen Fehler ist WebStorm zu versuchen, zu retten mich aus?
- lassen macht die variable zu einer Konstanten zu machen der internen Objekt-primitiven Typen. wenn Sie müssen, ändern Sie die Werte hinein, machen es nicht für die ständige Nutzung
var
um die variable zu deklarieren - Ich bin nicht davon überzeugt, dass wahr ist. Auch mit
var
ich bekomme immer noch den Fehler.const
macht die Dinge eine Konstante.let
Bereiche der Variablen in den block scope. - IDE ist einfach nur warnen Sie, dass die übergebene argument ist eine Referenz auf ein Objekt und in
forEach-loop
, wird der Wert geändert werden/verloren.. - Aber das ist meine Verwirrung, der Wert ist nicht verloren geht, so weit ich erzählen kann. Wenn Sie den code zu kopieren (mit der Funktion wrapper), die Namen sind korrekt geändert. Bin ich Missverständnis, was ist verloren? Weil ich sehe keine Werte verloren gehen.
- Früheren Wert von
surname
Objekt in der Hand hielt, verloren..IDE ist versucht zu sagen, dass, obwohl es ist ein argument für die Funktion, es als Verweis übergeben wird somit-Objekt aktualisiert wird! - Ah, ich sehe! Ich missverstanden, welcher Wert es sich bezog. Ganz eine lästige Fehlermeldung gegeben, dass die Aktualisierung der Objekt ist genau, was ich tun soll... gibt es etwas falsch mit dieser Art der Codierung dann? (das könnte ein anderer sein, SO Frage)
- Entweder Weg, das beantwortet meine Frage, die ich glaube. Wenn Sie möchten, konvertieren Sie es in die Antwort kann ich upvote und zu akzeptieren.
- es ist nur Dolmetscher/ - editor-Verwirrung und nicht alle code-Problem. Aber noch können Sie ersetzen .forEach mit der .map-Funktion, wenn Sie die Zuordnung aller Werte. Beide sind richtig, obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt nichts unsachgemäßen im code, WebStorm ist Typ-Inferenz ist immer ein bisschen verwirrt (dieser Aspekt von JavaScript ist besonders verwirrend).
Seine linter sieht ein string und meint Sie wird versuchen, so etwas wie dieses:
Führen würde, zu einem "verlorenen" Wert.
Die Tatsache, dass es nur fängt dieser 'Fehler' innerhalb der Funktion wirkt wie eine regelrechte bug, der gemeldet werden sollte.
Weiter zu verstehen, dieses seltsame Teil von JavaScript, ich empfehle Angus Croll ausgezeichnete in-depth-Artikel hier.
Ich Stand vor ähnlichen Problem mit eckigen benutzerdefinierte Richtlinie.
unten war meine benutzerdefinierte Richtlinie:
Nachdem sich durch die $kompilieren docs, ich habe mich entschieden, den code unten löst diese Warnung und funktioniert gut mit der Bindung zu Kind und Eltern Bereiche, ja natürlich, es sei denn, bis Ihr Modell ist eine Referenz auf ein Objekt.
Wenn Sie mit den eckigen Klammern der JetBrains-editor(WebS/PhpS) wird nicht zeigen Sie keine Fehler.
surname
. Meinst duperson['surname']
(beachten Sie die Anführungszeichen)?..is better written using in notation.
🙂