Wissen Sie wirklich, was Arrays sind?

Wo ich arbeite, erwarte ich PHP- und JavaScript-Kenntnisse von Webentwicklern. Während der Interviews stellte ich fest, dass es ausreicht, nur eine einfache Frage zu stellen, um herauszufinden, wie tief der Entwickler die Tools versteht, die er jeden Tag verwendet. Diese Frage lautet:

Was sind die Ähnlichkeiten und Unterschiede zwischen Arrays in JavaScript und in PHP?

Die Fähigkeit, Code zu schreiben, ist eine Sache. Und noch etwas anderes - ein Verständnis der internen Mechanismen der verwendeten Sprachen. Die Antwort auf diese einzelne Frage gibt mir eine ganze Reihe von Informationen über den Befragten. In der Tat hat fast jede gemeinsame Sprache Arrays. Es ist leicht anzunehmen, welche Arrays in verschiedenen Sprachen mehr oder weniger dasselbe sind. Viele Programmierer tun dies.





Dies ist eine falsche Annahme, die zu vielen kleinen Fehlern führt, zu irrational angeordnetem Code und zu der Unfähigkeit, die Stärken der Sprache effektiv zu nutzen.

Arrays und ihre Muttersprache - C.


Die C-Sprache ist nicht die erste Programmiersprache in der Geschichte, aber sie hat die IT-Branche mehr als andere beeinflusst. Viele Entwickler unterrichteten an C-Instituten als Muttersprache. Sowohl PHP als auch JavaScript haben etwas von C übernommen. Infolgedessen können wir einige Ähnlichkeiten zwischen diesen Sprachen und C beobachten, und es ist die Analyse von Arrays in C, die es uns ermöglicht zu zeigen, wie weit diese Datenstrukturen seit 1972 fortgeschritten sind.

In C sind Arrays stark typisiert und haben eine feste Länge.

int myArray[10];
int fibonacci[10] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34};

Oben sind einige Array-Deklarationen aufgeführt. Sie können nur Ganzzahlen speichern, deren Anzahl 10 nicht überschreitet.

Bei der Arbeit mit solchen Arrays wird eine Schleife verwendet for. Dieses Muster wird ohne wirklichen Bedarf in viele andere Programmiersprachen kopiert:

int i, sum;
for (i = 0; i < 9; i++) {
  sum += fibonacci[i];
}

Ein solches Design sieht weder in JavaScript noch in PHP wild aus. Aber hier liegt die Gefahr.

JavaScript-Arrays


Sie können sich vorstellen, dass Arrays in JavaScript den Arrays in C sehr ähnlich sind. Und die Wahrheit ist, dass die folgenden Konstruktionen in JS völlig normal aussehen:

let myArray = [];
let fibonacci = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34];

Arrays in JavaScript und in C sind jedoch zwei verschiedene Dinge. Zum Beispiel ist Folgendes in C offensichtlich nicht möglich:

myArray[0] = 5;
myArray[1] = 5.5;
myArray[2] = 'cat';
myArray[3] = [1,2,3];
myArray[4] = (a,b) => {a+b};
myArray[1000] = 'mind blown';
// myArray = [5, 5.5, 'cat', [1,2,3], (a,b) => {a+b}];

In JavaScript sind Arrays unterschiedlich lang. Die Art ihres Inhalts wird nicht gesteuert - genau wie die Art gewöhnlicher Variablen. Die Sprache übernimmt die Kontrolle über den Speicher, wodurch die Länge des Arrays zunehmen oder abnehmen kann und der Entwickler nicht darüber nachdenken kann. JavaScript-Arrays sind in der Tat Listen sehr ähnlich.

Die Array-Aufzählung kann mit einer erfolglosen Methode organisiert werden, die von C entlehnt wurde:

let sum = 0;
for (i = 0; i < fibonacci.length; i++) {
  sum += fibonacci[i];
}

Wir müssen diesen Ansatz jedoch nicht zum Auflisten von JS-Arrays verwenden. Zum Beispiel gibt es unnötige Zwischenvariablen. Bei einem solchen Entwurf können durchaus Fehler auftreten, deren Ursache undefinierte oder falsche Werte sind. Gibt es einen Wert im Array-Element fibonacci[10]? Und wenn der Wert da ist - ist es eine ganze Zahl?

JavaScript bietet jedoch viel bessere Mechanismen für die Arbeit mit Arrays. Arrays in JS sind nicht nur einige einfache Datenstrukturen. Sie sind wie Funktionen erstklassige Objekte. Sie haben Methoden, um verschiedene Probleme angemessen zu lösen:

let sum = fibonacci
   .filter(Number.isInteger)
   .reduce(
      (x,y) => {return x+y}, 0
    );

Dies ist viel besser als das Durchlaufen eines Arrays for.


Einige Methoden von Arrays.

Außerdem ist, wie bereits erwähnt, die Länge von Arrays in JS im Gegensatz zur Länge von C-Arrays nicht festgelegt. Auf diese Weise können Sie interessante Effekte auf Arrays erzielen, die sich auf deren Länge auswirken. Mit der Methode können Sie alsopopdas letzte Element aus dem Array extrahieren. Mit dieser Methodepushkönnen Sie am Ende des Arrays ein neues Element hinzufügen. Mit dieser Methodeunshiftkönnen Sie am Anfang des Arrays ein Element hinzufügen. Die Methodeshiftbesteht darin, das erste Element des Arrays zu extrahieren. Mit verschiedenen Kombinationen dieser Methoden können Sie mit Arrays wie mit Stapeln oder Warteschlangen arbeiten. Es hängt alles von den Bedürfnissen des Programmierers ab.

Arrays in PHP


Arrays in PHP sind fast wie JavaScript-Arrays.

Sie sind wie JS-Arrays von variabler Länge und schwacher Typisierung. Daher kann es verlockend sein, zu entscheiden, dass Arrays in PHP und in JS dasselbe sind.

$myArray = [];
$fibonacci = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34];
$myArray[0] = 5;
$myArray[1] = 5.5;
$myArray[2] = 'cat';
$myArray[3] = [1,2,3];
$myArray[4] = function($a, $b) { return $a + $b; };

Lambda-Funktionen in PHP sind nicht so schön wie ähnliche Funktionen in JS (in ES6), aber dieses in PHP geschriebene Beispiel entspricht funktional dem zuvor betrachteten JS-Beispiel.

Es kann verwendet werden, und Analoga oben beschriebenen Funktionen Elementen zum Array hinzuzufügen und sie daraus abzurufen ( array_push, array_pop, array_shift, array_unshift).

Aber in JavaScript (wie auch in C) können Sie nichts Ähnliches wie das Folgende schreiben (natürlich können Sie ähnlichen Code in JavaScript schreiben, aber es funktioniert nicht wie in PHP):

$myArray['banana'] = 'yellow fruit';
$myArray[5] = 'is alive';
$myArray[0.02] = 'the 2%';

In PHP sind Arrays aus technischer Sicht Hash-Tabellen oder Wörterbücher. Sie verwenden Schlüssel / Wert-Paare. Schlüssel können beliebige primitive Werte sein: Ganzzahlen, Gleitkommazahlen, Zeichenfolgen. Da PHP-Arrays auf Wörterbüchern basieren, ist es äußerst effizient, Schlüsselwerte in diesen Arrays zu finden. Die zeitliche Komplexität der Suche ist nämlich O(1).

Dies bedeutet, dass PHP-Arrays erfolgreich als einfache Nachschlagetabellen dienen können:

$colours = [
  'red' => '#FF0000',
  'green' => '#00FF00',
  'blue' => '#0000FF',
  'orange' => '#FF6600',
];

PHP-Arrays bieten dem Entwickler viel Flexibilität. Diese Arrays können nach Schlüssel und Wert sortiert werden. Sie können beispielsweise ein Array umdrehen array_flip, indem Sie die Schlüssel und Werte austauschen, wodurch eine Suche im Array der erforderlichen Daten sehr effizient organisiert werden kann.

Das Finden eines bestimmten Werts in einem regulären Array ist zeitaufwändig O(n), da Sie während der Suche jeden im Array gespeicherten Wert überprüfen müssen. In PHP ist es einfach, die zeitliche Komplexität derselben Operation auf Folgendes zu beschränken O(1):

$users = [
  1 => 'Andi',
  2 => 'Benny',
  3 => 'Cara',
  4 => 'Danny',
  5 => 'Emily',
];
$lookupTable = array_flip($users);
return $lookupTable['Benny'];

Ähnliches ist natürlich auch in JavaScript verfügbar, obwohl hier bereits auf die Fähigkeiten von Objekten zurückgegriffen werden muss. Aber aus diesem Grund müssen Sie einige Kompromisse eingehen. Bei der Arbeit mit Objekten verfügt der Entwickler nämlich nicht über Array-Methoden wie die oben beschriebenen.

Wenn wir die Diskussion über PHP-Arrays fortsetzen, können wir sagen, dass ihre Aufzählung einfach und sicher organisiert ist. Hier ist es möglich, einen Zyklus anzuwenden for, der dem gleichen Zyklus wie in C ähnelt. Bevor Sie dies tun, sollten Sie sich sorgfältig überlegen, warum Sie genau das tun sollten. Mit PHP können Sie dank Schleifen foreachProbleme lösen, die für Arrays variabler Länge spezifisch sind und Werte unterschiedlichen Typs enthalten können:

$sum = 0;
foreach ($myArray as $key => $value) {
  $sum += is_numeric($value) ? $value : 0;
}

Die Schleife bietet Zugriff auf beide Schlüssel und Werte, sodass der Programmierer mit beiden arbeiten kann.

Es ist erwähnenswert, dass sich PHP-Arrays von JS-Arrays darin unterscheiden, dass Sie in PHP externe Funktionen verwenden müssen, um einige Operationen mit Arrays auszuführen:

$sum = 
  array_reduce(
    array_filter($fibonacci, 'is_numeric'),
    function ($x, $y) { return $x + $y; },
    0
  };

Es ist funktional, aber nicht so schön wie in JavaScript. Wenn Sie Code für die Arbeit mit PHP-Arrays schreiben möchten, der dem in JavaScript verwendeten Code ähnelt (es gibt starke Argumente für diesen Ansatz), müssen Sie möglicherweise eine spezielle Lösung in Betracht ziehen. Sprich - zu einer Klasse Collectionaus dem Laravel-Framework. Mit PHP können Sie jedoch Objekte erstellen, deren Funktionen denen von Arrays ähneln (z. B. können sie in Schleifen verarbeitet werden foreach).

Wenn PHP Ihre Hauptprogrammiersprache ist, können Sie sich daran gewöhnen und die Macht, die in seinen grundlegenden Mechanismen lauert, völlig vergessen.

PHP-Arrays sind kurz gesagt das am meisten unterschätzte und unsichtbarste Merkmal der Sprache, das bei korrekter Verwendung von großem Nutzen sein kann.

Zusammenfassung: Frage und Antwort


Frage : Was sind die Ähnlichkeiten und Unterschiede zwischen Arrays in JavaScript und in PHP?

Antwort : In PHP und JavaScript sind Arrays im Wesentlichen schwach typisierte Listen mit variabler Länge. In JavaScript sind die Schlüssel für Array-Elemente geordnete Ganzzahlen. In PHP können Arrays sowohl mit Listen verglichen werden, die das Sortieren unterstützen, als auch mit Wörterbüchern, in denen es bequem ist, nach Elementen nach Schlüssel zu suchen. Die Schlüssel von PHP-Arrays können beliebige Werte primitiver Typen sein, und Sie können solche Arrays nach Schlüsseln oder nach Werten sortieren.

Liebe Leser! Welche Standardfunktionen fehlen Ihrer Meinung nach JavaScript-Arrays am meisten?


All Articles