312 Stimmen

Versteckte Funktionen von JavaScript?

Welche "versteckten Funktionen" von JavaScript sollte Ihrer Meinung nach jeder Programmierer kennen?

Nachdem ich die hervorragende Qualität der Antworten auf die folgenden Fragen gesehen habe, dachte ich, es wäre an der Zeit, sie für JavaScript zu stellen.

Obwohl JavaScript derzeit die wohl wichtigste Client-Side-Sprache ist (fragen Sie einfach Google), ist es erstaunlich, wie wenig die meisten Webentwickler wissen, wie leistungsfähig sie wirklich ist.

1 Stimmen

Meinten Sie nicht: "Nachdem ich gesehen habe, wie viele Sympathiepunkte und Meinungen diese andere Frage erhalten hat, dachte ich, ich stelle fast genau dieselbe Frage, um meine eigene zu verbessern"? ;-)

1 Stimmen

Klar, Pessimist :) Ich hatte überlegt, dies zu einer Gemeinschaftsfrage zu machen. Außerdem ist es so, dass ab einer bestimmten Anzahl von Punkten der Ertrag immer geringer wird.

1 Stimmen

Na gut - es sieht nicht so aus, als ob Sie den Vertreter "brauchen"! Ich schätze, ich habe nur ein großes Problem mit der C# ein - scheint nicht gerade wie die Art der Frage, für die diese Seite gedacht war.

373voto

Mark Cidade Punkte 95914

Sie brauchen keine Parameter für eine Funktion zu definieren. Sie können einfach die Funktion arguments Array-ähnliches Objekt.

function sum() {
    var retval = 0;
    for (var i = 0, len = arguments.length; i < len; ++i) {
        retval += arguments[i];
    }
    return retval;
}

sum(1, 2, 3) // returns 6

3 Stimmen

WOW! Wirklich?! Ich hatte ehrlich gesagt keine Ahnung. Diese Seite braucht wirklich eine "Lieblingsantworten"-Funktion. Ich würde das hier auf jeden Fall hinzufügen.

51 Stimmen

Es ist auch erwähnenswert, dass der Zugriff auf das Arguments-Objekt relativ kostspielig ist -- die besten Beispiele sind in Safari, Firefox und Chrome Nightlies, wo lediglich der Verweis auf die arguments Objekt macht den Aufruf einer Funktion viel langsamer - z.B. if(false) Argumente; schadet der Leistung.

48 Stimmen

In gleicher Weise hat arguments eine "calllee"-Eigenschaft, die die aktuelle Funktion selbst ist. Dies ermöglicht die Rekursion mit anonymen Funktionen, cool!

204voto

Martin Clarke Punkte 5520

Ich könnte den größten Teil von Douglas Crockfords ausgezeichnetem Buch zitieren JavaScript: Die guten Seiten .

Aber ich nehme nur einen für dich, benutze immer === y !== anstelle von == y !=

alert('' == '0'); //false
alert(0 == ''); // true
alert(0 =='0'); // true

== ist nicht transitiv. Wenn Sie === würde es falsch geben für alle diese Aussagen wie erwartet falsch.

3 Stimmen

Die meisten Menschen halten dies für einen der schlimmsten Teile der Sprache, wenn sie sie zum ersten Mal sehen (3 Gleichungen!?). Ich denke, dass es wichtig ist, darüber Bescheid zu wissen, weil es Sie zwingt, sich einzuprägen, dass JavaScript dynamisch typisiert ist.

0 Stimmen

Ja, ich stimme zu - Crockford spricht im Anhang über den "schlimmsten Teil". Es ist eine Schande, dass sie nicht einfach dafür sorgen konnten, dass "==" sich wie erwartet verhält.

29 Stimmen

Es ist eine Schande, dass so viele Leute denken, Crockford sei allwissend. Zugegeben, der Kerl hat mit den meisten seiner Kritikpunkte recht, aber ich will seine Sachen nicht pauschal gutheißen, wie es so viele Entwickler tun...

188voto

Gulzar Nazim Punkte 51098

Funktionen sind in JavaScript Bürger erster Klasse:

var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };

var sum = function(x,y,z) {
  return x+y+z;
};

alert( passFunAndApply(sum,3,4,5) ); // 12

Funktionale Programmiertechniken können verwendet werden, um elegantes Javascript zu schreiben .

Insbesondere können Funktionen als Parameter übergeben werden, z.B. Array.filter() nimmt einen Rückruf entgegen:

[1, 2, -1].filter(function(element, index, array) { return element > 0 });
// -> [1,2]

Sie können auch eine "private" Funktion deklarieren, die nur innerhalb des Bereichs einer bestimmten Funktion existiert:

function PrintName() {
    var privateFunction = function() { return "Steve"; };
    return privateFunction();
}

3 Stimmen

Es gibt drei Möglichkeiten, Funktionen in Javascript zu erstellen: function sum(x, y, z){ return (x+y+z); } und var sum = new Function("x", "y", "z", "return (x+y+z);"); sind die anderen Möglichkeiten.

6 Stimmen

Das Konzept "Funktionen als Daten" ist für mich ein absoluter Volltreffer.

0 Stimmen

Ich habe gerade das Beispiel aktualisiert, um zu zeigen, wie man eine "private" Funktion verwendet, die nur im Rahmen einer bestimmten Funktion existiert.

162voto

Mark Cidade Punkte 95914

Sie können die in Operator, um zu prüfen, ob ein Schlüssel in einem Objekt existiert:

var x = 1;
var y = 3;
var list = {0:0, 1:0, 2:0};
x in list; //true
y in list; //false
1 in list; //true
y in {3:0, 4:0, 5:0}; //true

Wenn Sie die Objektliterale zu hässlich finden, können Sie sie mit dem parameterlosen Funktionstipp kombinieren:

function list()
 { var x = {};
   for(var i=0; i < arguments.length; ++i) x[arguments[i]] = 0;
   return x
 }

 5 in list(1,2,3,4,5) //true

22 Stimmen

Nicht so clever, das prüft, ob ein Schlüssel vorhanden ist, nicht ob ein Wert vorhanden ist. x in list; funktioniert nur, weil x[1] != null ist, nicht weil der Wert 1 vorhanden ist.

1 Stimmen

Ich habe diese Technik seit einiger Zeit nicht mehr verwendet und daher vergessen, dass ich früher tatsächlich Objektliterale verwendet habe. Danke für die Korrektur.

34 Stimmen

Und Vorsicht: Der in-Operator testet auch die Prototypenkette! Wenn jemand dem Object.prototype eine Eigenschaft namens '5' zugewiesen hat, würde das zweite Beispiel true zurückgeben, auch wenn Sie '5 in list(1, 2, 3, 4)' aufrufen... Verwenden Sie lieber die Methode hasOwnProperty: list(1, 2, 3, 4).hasOwnProperty(5) gibt false zurück, auch wenn Object.prototype eine Eigenschaft '5' hat.

153voto

Christian C. Salvadó Punkte 763569

Zuweisung von Standardwerten an Variablen

Sie können den logischen Operator oder verwenden || in einem Zuweisungsausdruck, um einen Standardwert anzugeben:

var a = b || c;

Die a erhält den Wert der Variable c nur wenn b でございます falsy (wenn es null , false , undefined , 0 , empty string ou NaN ), andernfalls a erhält den Wert von b .

Dies ist oft in Funktionen nützlich, wenn Sie einem Argument einen Standardwert geben wollen, falls es nicht geliefert wird:

function example(arg1) {
  arg1 || (arg1 = 'default value');
}

Beispiel für IE-Fallback in Event-Handlern:

function onClick(e) {
    e || (e = window.event);
}

Die folgenden Sprachfunktionen gibt es schon seit langem, alle JavaScript-Implementierungen unterstützen sie, aber sie waren erst Teil der Spezifikation ECMAScript 5. Auflage :

Die debugger Anweisung

Beschrieben in: § 12.15 Die Debugger-Anweisung

Mit dieser Anweisung können Sie Haltepunkte programmatisch in Ihrem Code einfach durch:

// ...
debugger;
// ...

Wenn ein Debugger vorhanden oder aktiv ist, führt dies zu einem sofortigen Abbruch, genau in dieser Zeile.

Andernfalls, wenn der Debugger nicht vorhanden oder aktiv ist, hat diese Anweisung keine beobachtbare Wirkung.

Mehrzeilige String-Literale

Beschrieben in: § 7.8.4 String-Literale

var str = "This is a \
really, really \
long line!";

Sie müssen vorsichtig sein, denn das Zeichen neben dem \ muss ein Zeilenende sein, wenn Sie ein Leerzeichen nach der \ zum Beispiel wird der Code siehe genau dasselbe, aber es wird eine SyntaxError .

28 Stimmen

Nicht, wenn es null ist, wenn es als falsch angesehen wird. a = 0 || 42; ergibt 42. Dies ist vergleichbar mit Pythons oder-Operator, nicht mit C#s ?? Wenn Sie das C#-Verhalten wollen, machen Sie a = (b === null) ? c : b;

0 Stimmen

Es funktioniert auch in Visual Studio, wenn Sie mit ASP.NET entwickeln :)

2 Stimmen

Ich wünschte, es gäbe einen richtigen || nur für undefiniert. Ich war von diesem heute für 0 gebissen, da ich Emulation von überladenen Methode erstellen wollte, so dass das letzte Argument optional war und ein Standardwert stattdessen verwendet werden würde.

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