In der letzten Woche habe ich erklärt, warum man zur Referenzierung von Nutzern userIds und nicht Nicknamen speichern sollte. Heute geht es darum, wie man userIds nicht speichern sollte.
Fällt dir irgendetwas Besonderes auf, wenn du diese Zeilen Code siehst?
this.onUserJoined = function(user) { var userId = user.getUserId(); usersJoined[userId] = user.getNick(); }
Auf den ersten Blick sieht daran gar nichts schlimm aus. In einem Objekt werden sich alle User gemerkt, die bereits im Channel waren.
Die Frage ist, wie die Variable userJoined
definiert ist. Ist sie ein Array
oder ein beliebiges anderes Object
?
Warum ist das so wichtig?
In JavaScript-Objekten lassen sich beliebige Key-Value-Paare merken. Das ist gutartig und findet oft sinnvolle Verwendung. Wenn das Objekt ein Array und der Key eine Zahl ist, dann kommt es aber zu Problemen.
Arrays nutzen diese Methode, um das sich selbst zu befüllen.
var obj = {}; obj[5000] = 'Test'; // Es gibt nun ein Object mit einem Eintrag für den Key 5000 var arr = []; arr[5000] = 'Test'; // Es gibt nun ein Array mit 5000 leeren Einträgen (Index 0 - 4999) // und einem Eintrag 'Test' an Index 5000.
Das Array bläht sich auf und ist riesig. Dies ist aus mehreren Gründen schlecht:
- Arbeitsspeicher – Deiner App stehen maximal 10MB zur Verfügung
- Persistenz – Deiner App stehen maximal 100MB zur Verfügung
- Datenversand an User Interface – Pro Event können maximal 10.000 Zeichen gesendet werden