2017-04-20 4 views
2

Ich kann eine grundlegende Frage stellen, aber ich weiß nicht, wie eine solche VerwirrungWarum werden diese beiden dynamischen Eigenschaftszuweisungen zu einem einzigen Wert zusammengefasst?

dieser Code unten durch Google-Suche löschen funktioniert gut und Worte zählen, so dass ich versuchte, weiter zu verstehen

var words = chunk.trim().split(' '); 
     var counts = {}; 

    // Count words 
    words.forEach(function (word) { 
     word = word.trim(); 

     if (word.length) { 
      if (!counts[word]) { 
       counts[word] = 0; 
      } 

      counts[word]++; 
     } 
    }); 

dann, warum gibt mir das unten 1,2. Ich erwarte 1,2 und its me 2,2

var a = function(){ 
    var a, b; 
    var obj = {} 
    obj[a]=1; 
    obj[b]=2; 

    console.log(obj[a]); 
    console.log(obj[b]); 
} 

var res = a(); 
+1

Beide 'a' und 'b' sind' undefined', so die einzige Eigenschaft, die Sie Einstellung auf 'obj' hat die Name "undefined", so erhält es den letzten Wert, den Sie festlegen. Alle Objekteigenschaften sind im Grunde Zeichenfolgen (außer Symbole), also wird alles, was Sie für eine Eigenschaft angeben, in eine Zeichenfolge konvertiert. –

+0

Verschiedene Möglichkeiten, dies zu testen, wären 'console.log()' die Werte von 'a' und' b', und das Ergebnis von 'Object.keys (obj)' zu protokollieren, um zu sehen, welche Schlüssel Sie ihm gegeben haben. –

Antwort

1

Warum funktioniert das mir nicht 1,2 geben? Ich erwarte 1,2 und es ist mir 2,2

geben Dies geschieht, weil a == b; sie sind beide undefined, weil Sie ihnen nie Werte auf der Linie var a, b zugewiesen haben. Wenn Sie die = Zuordnung in var Deklarationen weglassen, wird stattdessen der Standardwert undefined verwendet, was bedeutet, dass Ihre Zeile var a = undefined, b = undefined wird.

Somit ist die zweite Eigenschaft Zuweisung (obj[b] = 2) tatsächlich Überschreiben der erste (obj[a] = 1). Ihre obj nur einen einzigen Schlüssel enthält, und nach dem Code seiner Gesamtstruktur läuft wie folgt aussieht:

{ 
    'undefined': 2 
} 

var a = function() { 
 
    var a, b 
 
    var obj = {} 
 
    obj[a] = 1 
 
    obj[b] = 2 
 

 
    console.log(obj) 
 
} 
 

 
var res = a()

Wenn Sie die Ergebnisse wollen Sie erwarten, müssen Sie verschiedene Schlüssel verwenden, wie die Saiten 'a' und 'b':

var a = function() { 
 
    var a = 'a', b = 'b' 
 
    var obj = {} 
 
    obj[a] = 1 
 
    obj[b] = 2 
 
    
 
    console.log(obj) 
 
    console.log(obj[a], obj[b]) 
 
} 
 

 
var res = a()

+0

danke, also warum funktioniert 'count [word] = 0;' work. Ich sehe keine Zeile im ganzen Code wie 'var word = 'word'; 'im Beispiel der Wortzählung (ich habe Teilcode veröffentlicht) – user1207289

+1

Der [' Array.prototype.forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ forEach) -Funktion übergibt automatisch einen "Wort" -Wert an den Callback (hier beziehe ich mich auf die 'Funktion (Wort) {...}'), und dies geschieht einmal für jedes Element im Array 'words'. Da das Array "words" mehrere verschiedene Wörter enthalten kann, tritt die Schlüsselkollision bei Zuweisungen nicht immer auf. – gyre

+1

Warum funktioniert counts [word]? Der Grund ist, dass JS aufgrund der Notation [] versucht, dem counts-Objekt eine Eigenschaft hinzuzufügen, nachdem es überprüft hat, ob es existiert (falls Bedingung). Also, counts [word] = 0 Anweisung macht drei Dinge, 1) werte den Wert der Wortvariable aus (wenn nicht eine Zeichenkette dann in Zeichenkette umwandeln), 2) füge diese Bewertung hinzu, sage es "abc" als Eigenschaft zu counts Objekt. So wird es, counts.abc. 3) Setzen Sie den Wert der Eigenschaft auf 0, so dass counts.abc gleich 0 ist. Später wird die Anzahl erhöht, wenn sie erneut gefunden wird. –

6

geben Weil du nur du erklären (nicht zuweisen) a und b, und in Javascript eine nicht zugeordnete Variable ist implizit undefined.

Sie beziehen sich im Wesentlichen auf obj[undefined] zweimal

obj[undefined]=1; 
obj[undefined]=2; //you're overriding the variable 


console.log(obj[undefined]); //2 
console.log(obj[undefined]); //2 
1

Wenn Sie obj [a] sagen, versucht Javascript eine Eigenschaft auf obj mit dem Wert in a zu erstellen. Da der Wert in a undefiniert ist, ist die Zeichenfolgendarstellung "undefiniert" und daher wird für obj eine nicht definierte Eigenschaft erstellt. Da b auch einen undefinierten Wert hat, schreiben Sie im Wesentlichen 2 auf dieselbe Eigenschaft undefiniert.

Daher erhalten Sie 2 beide Male. Eigentlich, wenn Sie obj einloggen und den Wert in der Konsole sehen, würden Sie sehen:

Object {undefined: 2} 
undefined:2 
Verwandte Themen