Gerade oder ungerade Zahlen finden
Ich suche nach Kritik, um zu sehen, was ich hätte besser machen können oder wie ich mich dem Schreiben eines Skripts zum Finden gerader oder ungerader Zahlen nähern könnte. Ich bin neu in der Programmierung mit JavaScript und im Programmieren im Allgemeinen. Dies ist eine der ersten Herausforderungen, die ich geschrieben habe, um gerade oder ungerade Zahlen zu finden.
var numList = [];
while(numList.length < 5){
numList.push(window.prompt());
}
var evenNumbers = [];
numList.forEach(function(element){
if (element % 2 === 0){
evenNumbers.push(element);
}
})
document.write(evenNumbers);
Antworten
Sie können Array.prototype.filter verwenden .
Sie können so lesen: Geben Sie ein Array zurück, das nur die Elemente enthält, die den Rückgabefunktionsausdruck erfüllen.
Auf diese Weise können Sie vermeiden, ein Array zu instanziieren und erst nach dieser Iteration die push.
var numList = [];
while(numList.length < 5){
numList.push(window.prompt());
}
var evenNumbers = numList.filter(function (element) {
return element % 2 === 0
});
// that's the same that
// var evenNumbers = numList.filter(element => element % 2 === 0);
document.write(evenNumbers);
Sie können jedoch Pfeilfunktionen verwenden , die eine sauberere Syntax haben.
Verschiedene Möglichkeiten, um gerade oder ungerade Zahlen zu finden.
Während der Modulo-Operator zum Testen, ob eine Zahl gerade oder ungerade ist, gut funktioniert, ist eine schnellere Technik (von der ich nicht erwarten würde, dass ein Anfänger sie kennt) die Verwendung von bitweisem UND - dh& . In diesem Artikel finden Sie eine ausführliche Erklärung, wie es funktioniert .
function isEven(number) {
return !(number & 1);
}
for (let x = 0; x < 6; x++) {
console.log(x, ' is even: ', isEven(x));
}
Andere Bewertungsaspekte
Filtern des Arrays
Wie Lucas bereits erwähnt Array.prototype.filter()hat, kann es verwendet werden, um das Hinzufügen von Elementen in zu vereinfachen evenNumbers. Array.prototype.reduce()könnte verwendet werden, obwohl es nicht so präzise wäre, da jede Iteration das kumulative Array zurückgeben müsste, und der Anfangswert auf ein Array gesetzt werden müsste.
Sie haben zwar nicht speziell nach der Leistung gefragt, aber wenn Sie möchten, dass der Code so effizient wie möglich ist (z. B. wird er millionenfach (oder öfter) in kurzer Zeit ausgeführt, dann vermeiden Sie Iteratoren - z. B. funktionale Techniken mit array.filter(), array.map(), sowie for...ofSchleifen - verwenden Sie eine forSchleife.
Variablen deklarieren
constkönnte stattdessen verwendet werden var, um eine versehentliche Neuzuweisung für beide Arrays zu vermeiden, und wenn sich die Variablen innerhalb eines Blocks befänden, wäre der Gültigkeitsbereich auf den Block beschränkt. Beachten Sie, dass "es möglich ist, Elemente in das Array zu schieben" 1 , auch wenn es mit deklariert ist const.
Benutzer zur Eingabe auffordern
window.prompt()„zeigt einen Dialog mit einer optionalen Nachricht an, die den Benutzer auffordert, Text einzugeben.“ 2 . Als erstes Argument könnte eine freundliche Nachricht übergeben werden, um dem Benutzer Informationen über die erwartete Eingabe zu geben - z
window.prompt(“Please enter a number”);
Zusätzlich:
Bitte beachten Sie, dass das Ergebnis ein String ist. Das bedeutet, dass Sie manchmal den vom Benutzer angegebenen Wert umwandeln sollten. Wenn ihre Antwort beispielsweise eine Zahl sein soll, sollten Sie den Wert in Zahl umwandeln.
const aNumber = Number(window.prompt("Type a number", ""));
3
Der NumberKonstruktor könnte also verwendet werden, um Zahlen im Array zu speichern.
numList.push(Number(window.prompt("Please enter a number")));
Ausgabe senden mitdocument.write()
Hinweis : Da
document.write()in den Dokumentenstrom geschrieben wird, wird beim Aufrufendocument.write()eines geschlossenen (geladenen) Dokuments automatisch document.open() aufgerufen, wodurch das Dokument gelöscht wird .
4
Planen Sie also nicht, diese Funktion für Skripte zu verwenden, die auf Webseiten mit auf der Seite vorhandenen DOM-Elementen ausgeführt werden, damit sie nicht entfernt werden.
Verwenden Sie let ES6 anstelle von var
var numList = [];
let numList = [];
etc.
Verwenden Sie die Filtermethode
numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } })
Wie von Lucas Wauke vorgeschlagen
let evenNumbers = numList.filter(element => element % 2 === 0);
Teilen Sie dem Benutzer mit, was er in die Eingabeaufforderung eingeben soll
numList.push(window.prompt());
numList.push(window.prompt("Please enter a whole number"));
Sie sollten auf jeden Fall an Ihrem Codestil arbeiten, um ihn besser lesbar zu machen
Verwenden Sie Einzüge
while(numList.length < 5){ numList.push(window.prompt()); }
while(numList.length < 5){
numList.push(window.prompt());
}
Lassen Sie Leerzeichen vor geschweiften Klammern
numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } })
numList.forEach(function(element) {
if (element % 2 === 0) {
evenNumbers.push(element);
}
})
Meiner Meinung nach ist es besser lesbar, wenn Sie ein Leerzeichen in Klammern lassen.
Ich persönlich kenne nicht viele Leute, die das tun, aber probiere es aus, vielleicht funktioniert es für dich
numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } })
numList.forEach( function( element ) {
if ( element % 2 === 0 ) {
evenNumbers.push( element );
}
} )
Dies ist besonders hilfreich, wenn mit vielen Klammern ( Pseudocode ) gearbeitet wird:
method(function(method(getter())).setSomething(getSomethingFromSomewhere(somewhere)))
method( function( method( getter() ) ).setSomething( getSomethingFromSomewhere( somewhere ) ) )
Wie Sie sehen können, ist es ziemlich einfach zu erkennen, welche Klammern zusammengehören
Fazit
Vor
var numList = []; while(numList.length < 5){ numList.push(window.prompt()); } var evenNumbers = []; numList.forEach(function(element){ if (element % 2 === 0){ evenNumbers.push(element); } }) document.write(evenNumbers);
Gemäß
let numList = [];
while ( numList.length < 5 ) {
numList.push( window.prompt() );
}
let evenNumbers = numList.filter(element => element % 2 === 0);
document.write( evenNumbers );