3 Stimmen

Rätselhaftes Javascript Array Verhalten

Vielleicht ist das eine wirklich dumme Frage, aber ich habe offensichtlich etwas übersehen.

Betrachten Sie den folgenden Code:

    var selectedItems = [];
    selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
    //fyi, selectedItems[selectedItems.length] = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"; produced the same result.

Am Ende selectedItems Der Inhalt sieht folgendermaßen aus:

Name              Value                                    Type
-------------     --------------------------------------   ------
selectedItems     {...}                                    Object
   -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String
   -  length      1                                        Long

Aber wenn ich einfach versuche, split() auf die gleiche Zeichenfolge aufzurufen, wie dies:

selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")

Jetzt sieht der Inhalt meines vermeintlichen Arrays wie folgt aus (fehlende Länge):

Name              Value                                    Type
-------------     --------------------------------------   ------
selectedItems     {...}                                    Object
   -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String

Haben Sie eine Idee, was der Unterschied ist? Was passiert hier eigentlich?
Vielen Dank im Voraus.

AKTUALISIERT : Ich habe das Gefühl, es gibt tatsächlich etwas strukturell über die beiden resultierenden Werte unterschiedlich, weil (Atlas) Ajax auf die eine mit der Länge-Eigenschaft erstickt, wenn ich versuche, es zu einem Server-seitigen WebMethod (keine tatsächliche Fehlermeldung übergeben, aber ich weiß, der Aufruf fehlschlägt). Ich bin mir nicht sicher.

UPDATE #2 Mir ist aufgefallen, dass das Einstellen der targetLocationIdList auf diese Weise dazu führt, dass die Eigenschaft "length" im Fenster Quick Watch nicht angezeigt wird:

  var params = 
  {
    jobId : args.get_JobId(), 
    targetLocationIdList : retVal.split(',')
  };

Diese Ergebnisse enthalten jedoch die Eigenschaft "Länge", die im Fenster Quick Watch angezeigt wird:

  var retValArr = [];
  retValArr = retVal.split(',');

  var params = 
  {
    jobId : args.get_JobId(), 
    targetLocationIdList : retValArr 
  };

3voto

AutomatedTester Punkte 21864

Programmtechnisch gibt es überhaupt keinen Unterschied. Wenn Sie Ihr Beispiel sowohl im Chrome-Entwicklerfenster als auch in Firebug ausführen, sieht es aus wie das 2.

 Name              Value               
 Type
 -------------     --------------------------------------   ------ 
 selectedItems     {...}                                    Object
    -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String

Länge ist eine implizite Eigenschaft

EDIT

var retVal = 'test';
var params = 
  {
    jobId : 1, 
    targetLocationIdList : retVal.split(',')
  }; 
console.log(params.targetLocationIdList.length) // prints 1

Der Code oben druckt 1 in IE8, Firefox, Chrome (in ihren Dev-Tools oder Firebug), so denken, dass dies ein Problem mit Visual Studio oder mit Atlas in der Art und Weise sein muss, dass es das Objekt zeigt.

2voto

edeverett Punkte 7630

Könnte es sich um einen Fehler im Debugger handeln? (Oder verursacht dies Probleme im Browser?)

2voto

Oded Punkte 475566

Im ersten Fall deklarieren Sie selectedItems als Array und ordnen es dann zu.

Im zweiten Fall ordnen Sie es direkt aus der Splitmethode zu.

Ich kann nur annehmen, dass VS die Array-Deklaration als Hinweis zur Anzeige der Längeneigenschaft verwendet.

1voto

William Punkte 6286

Es sieht so aus, als hätten Sie einen Fehler in Microsofts Javascript-Implementierung gefunden. Es ist wahrscheinlich, dass Visual Studio und der IE dieselbe Implementierung verwenden, weshalb der Fehler nur in diesen beiden Programmen und nicht in Firefox oder Chrome auftritt.

In der EMCAScript-Norm: http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf

15.5.4.14 String.prototype.split (Trennzeichen, Grenze)
Gibt ein Array-Objekt zurück, in dem Teilzeichenfolgen des Ergebnisses der Umwandlung dieses Objekts in eine Zeichenfolge gespeichert wurden.

In der Definition von Array Object:

15.4 Array-Objekte
... Jedes Array-Objekt hat eine Längeneigenschaft, deren Wert immer eine nichtnegative ganze Zahl ist kleiner als 2 32 .

0voto

Vinay Sajip Punkte 89444

Welchen Browser verwenden Sie, und sind Sie sicher, dass es keine length Eigentum? Ich habe gerade

var arr = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")

in meiner Firebug-Konsole, und arr hat eine length Eigenschaft erwartungsgemäß gleich 1.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X