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 hatte, dachte ich, es sei Zeit, sie nach JavaScript zu fragen.
- Versteckte Funktionen von HTML
- Versteckte Funktionen von CSS
- Versteckte Funktionen von PHP
- Versteckte Funktionen von ASP.NET
- Versteckte Funktionen von C #
- Versteckte Funktionen von Java
- Versteckte Funktionen von Python
Obwohl JavaScript derzeit wohl die wichtigste clientseitige Sprache ist (fragen Sie einfach Google), ist es überraschend, wie wenig die meisten Webentwickler schätzen, wie leistungsfähig es wirklich ist.
javascript
hidden-features
Binoj Antony
quelle
quelle
Antworten:
Sie müssen keine Parameter für eine Funktion definieren. Sie können einfach das
arguments
Array-ähnliche Objekt der Funktion verwenden .quelle
arguments
Objekts das Aufrufen einer Funktion viel langsamer macht - z. if (falsche) Argumente; wird perf weh tun.arguments.callee
dies veraltet ist.Ich könnte den größten Teil von Douglas Crockfords ausgezeichnetem Buch JavaScript: The Good Parts zitieren .
Aber ich nehme nur eine für dich, benutze immer
===
und!==
anstelle von==
und!=
==
ist nicht transitiv. Wenn Sie es verwenden===
, würde es erwartungsgemäß für alle diese Aussagen false geben.quelle
==
ist'\n\t\r ' == 0
=>true
...: DFunktionen sind erstklassige Bürger in JavaScript:
Funktionale Programmiertechniken können verwendet werden, um elegantes Javascript zu schreiben .
Insbesondere können Funktionen als Parameter übergeben werden, z. B. akzeptiert Array.filter () einen Rückruf:
Sie können auch eine "private" Funktion deklarieren, die nur im Rahmen einer bestimmten Funktion vorhanden ist:
quelle
new Function()
ist so böse wieeval
. Verwende nicht.Sie können die Verwendung in Bediener zu überprüfen , ob ein Schlüssel in einem Objekt vorhanden ist :
Wenn Sie die Objektliterale zu hässlich finden, können Sie sie mit dem parameterlosen Funktionstipp kombinieren:
quelle
Variablen Standardwerte zuweisen
Sie können die Logik oder den Operator
||
in einem Zuweisungsausdruck verwenden, um einen Standardwert anzugeben:Die
a
Variable wird den Wert erhalten ,c
nur wennb
ist falsy (wenn istnull
,false
,undefined
,0
,empty string
, oderNaN
), andernfallsa
wird der Wert erhaltenb
.Dies ist häufig in Funktionen hilfreich, wenn Sie einem Argument einen Standardwert zuweisen möchten, falls es nicht angegeben wird:
Beispiel für einen IE-Fallback in Ereignishandlern:
Die folgenden Sprachfunktionen sind seit langem bei uns, alle JavaScript-Implementierungen unterstützen sie, waren jedoch erst in ECMAScript 5th Edition Teil der Spezifikation :
Die
debugger
AussageBeschrieben in: § 12.15 Die Debugger-Anweisung
Mit dieser Anweisung können Sie Haltepunkte programmgesteuert in Ihren Code einfügen, indem Sie:
Wenn ein Debugger vorhanden oder aktiv ist, wird er sofort direkt in dieser Zeile unterbrochen.
Andernfalls hat diese Anweisung keine beobachtbare Auswirkung, wenn der Debugger nicht vorhanden oder aktiv ist.
Mehrzeilige String-Literale
Beschrieben in: § 7.8.4 String-Literale
Sie müssen vorsichtig sein , weil das Zeichen neben dem
\
muss ein Leitungsabschluss sein, wenn Sie ein Leerzeichen nach dem haben\
zum Beispiel, wird der Code aussehen genau das gleiche, aber es wird ein erhöhenSyntaxError
.quelle
JavaScript hat keinen Blockbereich (aber es hat einen Abschluss, also nennen wir es sogar?).
quelle
Sie können mit
[]
statt auf auf Objekteigenschaften zugreifen.
Auf diese Weise können Sie eine Eigenschaft nachschlagen, die einer Variablen entspricht.
Sie können dies auch verwenden, um Objekteigenschaften abzurufen / festzulegen, deren Name keine legale Kennung ist.
Einige Leute wissen das nicht und verwenden eval () wie folgt, was eine wirklich schlechte Idee ist :
Dies ist schwerer zu lesen, schwerer zu finden (kann jslint nicht verwenden), langsamer auszuführen und kann zu XSS-Exploits führen.
quelle
foo.bar
verhält sich laut spezifikation sowieso genausofoo["bar"]
. Beachten Sie auch, dass alles eine Zeichenfolgeeigenschaft ist. Selbst wenn Sie Array-Zugriff ausführen,array[4]
wird die 4 in eine Zeichenfolge konvertiert (wiederum zumindest gemäß ECMAScript v3-Spezifikation)Wenn Sie nach einer anständigen JavaScript-Referenz zu einem bestimmten Thema suchen, geben Sie das Schlüsselwort "mdc" in Ihre Abfrage ein. Ihre ersten Ergebnisse stammen aus dem Mozilla Developer Center. Ich habe keine Offline-Referenzen oder Bücher bei mir. Ich verwende immer den Schlüsselworttrick "mdc", um direkt zu dem zu gelangen, wonach ich suche. Zum Beispiel:
Google: Javascript-Array sortieren mdc
(in den meisten Fällen können Sie "Javascript" weglassen)
Update: Mozilla Developer Center wurde in Mozilla Developer Network umbenannt . Der Schlüsselworttrick "mdc" funktioniert immer noch, aber bald müssen wir möglicherweise stattdessen "mdn" verwenden .
quelle
Vielleicht ein bisschen offensichtlich für einige ...
Installieren Sie Firebug und verwenden Sie console.log ("Hallo"). So viel besser als die Verwendung von random alert (); 's, an die ich mich erinnere, dass ich vor ein paar Jahren viel getan habe.
quelle
Private Methoden
Ein Objekt kann private Methoden haben.
quelle
Auch in Crockfords "Javascript: The Good Parts" erwähnt:
parseInt()
ist gefährlich. Wenn Sie ihm eine Zeichenfolge übergeben, ohne ihn über die richtige Basis zu informieren, werden möglicherweise unerwartete Zahlen zurückgegeben. BeispielparseInt('010')
: Gibt 8 statt 10 zurück. Wenn Sie eine Basis an parseInt übergeben, funktioniert sie ordnungsgemäß:quelle
Math.floor
oderNumber
?10 === Math.floor("010"); 10 === Number("010");
schwimmt:42 === Math.floor("42.69"); 42.69 === Number("42.69");
parseInt
Funktion könnte leicht dazu gebracht werden, etwas zu tun, das nicht so harmlos ist.__parseInt = parseInt; parseInt = function (str, base) { if (!base) throw new Error(69, "All your base belong to us"); return __parseInt(str, base); }
Funktionen sind Objekte und können daher Eigenschaften haben.
quelle
Ich muss sagen, dass sich Funktionen selbst ausführen.
Da Javascript keinen Blockbereich hat , können Sie eine selbstausführende Funktion verwenden, wenn Sie lokale Variablen definieren möchten:
Hier
myvar
wird der globale Bereich nicht beeinträchtigt oder verschmutzt und verschwindet, wenn die Funktion beendet wird.quelle
.js
Dateien in eine anonyme selbstausführende Funktion ein und hänge alles, worauf ich global zugreifen möchte, an daswindow
Objekt an. Verhindert die Verschmutzung des globalen Namespace.Wissen, wie viele Parameter von einer Funktion erwartet werden
Wissen, wie viele Parameter von der Funktion empfangen werden
quelle
function.length
.Hier sind einige interessante Dinge:
NaN
mit etwas (nochNaN
) ist immer falsch, das schließt==
,<
und>
.NaN
Steht für Not a Number, aber wenn Sie nach dem Typ fragen, wird tatsächlich eine Nummer zurückgegeben.Array.sort
kann eine Komparatorfunktion übernehmen und wird von einem Quicksort-ähnlichen Treiber aufgerufen (abhängig von der Implementierung).$0
,$1
,$2
Mitglieder auf einem regulären Ausdruck.null
ist anders als alles andere. Es ist weder ein Objekt, ein Boolescher Wert, eine Zahl, eine Zeichenfolge nochundefined
. Es ist ein bisschen wie eine "Alternative"undefined
. (Hinweis:typeof null == "object"
)this
ergibt sich das ansonsten unbenennbare [globale] Objekt.var
, anstatt sich nur auf die automatische Deklaration der Variablen zu verlassen, hat die Laufzeit eine echte Chance, den Zugriff auf diese Variable zu optimierenwith
Konstrukt wird solche Optimierungen zerstörenbreak
. Schleifen können beschriftet und als Ziel von verwendet werdencontinue
.undefined
. (hängt von der Implementierung ab)if (new Boolean(false)) {...}
wird den{...}
Block ausführen[als Reaktion auf gute Kommentare ein wenig aktualisiert; siehe Kommentare]
quelle
typeof null
gibt "Objekt" zurück.undefined
ist dies der Fall, aber dies ist nur der Standardwert, den Sie erhalten, wenn Sie nach einem Index suchen, der nicht vorhanden ist. Wenn Sie ein [2000] aktiviert haben, ist dies auch der Fallundefined
, aber das bedeutet nicht, dass Sie noch Speicher dafür zugewiesen haben. In IE8 sind einige Arrays dicht und andere spärlich, je nachdem, wie sich die JScript-Engine zu diesem Zeitpunkt anfühlte. Lesen Sie hier mehr: blogs.msdn.com/jscript/archive/2008/04/08/…Ich weiß, dass ich zu spät zur Party komme, aber ich kann einfach nicht glauben, dass die
+
Nützlichkeit des Betreibers nicht erwähnt wurde, außer "irgendetwas in eine Zahl umwandeln". Vielleicht ist das so gut versteckt?Natürlich können Sie dies alles
Number()
stattdessen verwenden, aber der+
Bediener ist so viel hübscher!Sie können auch einen numerischen Rückgabewert für ein Objekt definieren, indem Sie die
valueOf()
Methode des Prototyps überschreiben . Eine für dieses Objekt durchgeführte Zahlenkonvertierung führt nichtNaN
zum Rückgabewert dervalueOf()
Methode:quelle
0xFF
usw. tun , ohne dass dies erforderlich ist+"0xFF"
.0xFF
, ähnlich wie Sie1
stattdessen schreiben können+true
. Ich schlage vor, dass Sie+("0x"+somevar)
als Alternative zu verwenden könnenparseInt(somevar, 16)
, wenn Sie möchten." Erweiterungsmethoden in JavaScript " über die Prototyp-Eigenschaft.
Dadurch wird
contains
allenArray
Objekten eine Methode hinzugefügt . Sie können diese Methode mit dieser Syntax aufrufenquelle
Um eine Eigenschaft ordnungsgemäß aus einem Objekt zu entfernen, sollten Sie die Eigenschaft löschen, anstatt sie nur auf undefiniert zu setzen :
Die Eigenschaft prop2 wird weiterhin Teil der Iteration sein. Wenn Sie prop2 vollständig entfernen möchten , sollten Sie stattdessen Folgendes tun:
Die Eigenschaft prop2 wird nicht mehr angezeigt, wenn Sie die Eigenschaften durchlaufen.
quelle
with
.Es wird selten verwendet und ist ehrlich gesagt selten nützlich ... Aber unter bestimmten Umständen hat es seine Verwendung.
Zum Beispiel: Objektliterale sind sehr praktisch, um Eigenschaften für ein neues Objekt schnell einzurichten . Was aber, wenn Sie die Hälfte der Eigenschaften eines vorhandenen Objekts ändern müssen ?
Alan Sturm weist darauf hin , dass dies etwas gefährlich sein: Wenn das Objekt als Kontext verwendet wird , nicht hat eine der Eigenschaften wurde zugewiesen, wird es in dem äußeren Umfang gelöst werden, was möglicherweise zu schaffen oder eine globale Variable zu überschreiben. Dies ist besonders gefährlich, wenn Sie es gewohnt sind, Code für die Arbeit mit Objekten zu schreiben, bei denen Eigenschaften mit Standardwerten oder leeren Werten undefiniert bleiben:
Daher ist es wahrscheinlich eine gute Idee, die Verwendung der
with
Anweisung für eine solche Zuordnung zu vermeiden .Siehe auch: Gibt es legitime Verwendungszwecke für die JavaScript-Anweisung "with"?
quelle
Methoden (oder Funktionen) können für Objekte aufgerufen werden, die nicht dem Typ entsprechen, für den sie entwickelt wurden. Dies ist ideal, um native (schnelle) Methoden für benutzerdefinierte Objekte aufzurufen.
Dieser Code stürzt ab, weil
listNodes
es sich nicht um einen handeltArray
Dieser Code funktioniert, weil
listNodes
genügend Array-ähnliche Eigenschaften (Länge, Operator []) definiert sind, um von verwendet zu werdensort()
.quelle
Die prototypische Vererbung (populär gemacht von Douglas Crockford) revolutioniert die Art und Weise, wie Sie über viele Dinge in Javascript denken.
Es ist ein Mörder! Schade, wie fast niemand es benutzt.
Sie können damit neue Instanzen eines Objekts "erzeugen", erweitern und gleichzeitig eine (live) prototypische Vererbungsverknüpfung zu ihren anderen Eigenschaften beibehalten. Beispiel:
quelle
Einige würden dies Geschmackssache nennen, aber:
Der Trinary-Operator kann so verkettet werden, dass er sich wie im Schema verhält (cond ...):
kann geschrieben werden als ...
Dies ist sehr "funktional", da es Ihren Code ohne Nebenwirkungen verzweigt. Also statt:
Du kannst schreiben:
Funktioniert auch gut mit Rekursion :)
quelle
Zahlen sind auch Objekte. So kannst du coole Sachen machen wie:
quelle
times
ist nicht effizient:Math.floor
wird jedes Mal statt nur einmal aufgerufen.Wie wäre es mit Schließungen in JavaScript (ähnlich wie bei anonymen Methoden in C # v2.0 +). Sie können eine Funktion erstellen, die eine Funktion oder einen "Ausdruck" erstellt.
Beispiel für Schließungen :
quelle
Sie können Klassen auch erweitern (erben) und Eigenschaften / Methoden überschreiben, indem Sie den Prototyp-Kettenlöffel16 verwenden, auf den angedeutet wird.
Im folgenden Beispiel erstellen wir eine Klasse Pet und definieren einige Eigenschaften. Wir überschreiben auch die von Object geerbte .toString () -Methode.
Danach erstellen wir eine Dog-Klasse, die Pet erweitert und die .toString () -Methode überschreibt, um ihr Verhalten erneut zu ändern (Polymorphismus). Zusätzlich fügen wir der untergeordneten Klasse einige andere Eigenschaften hinzu.
Danach überprüfen wir die Vererbungskette, um zu zeigen, dass Dog immer noch vom Typ Dog, vom Typ Pet und vom Typ Object ist.
Beide Antworten auf diese Frage waren Codes, die aus einem großartigen MSDN-Artikel von Ray Djajadinata modifiziert wurden.
quelle
Abhängig von ihrem Typ können Sie Ausnahmen abfangen. Zitiert aus MDC :
HINWEIS: Bedingte catch-Klauseln sind eine Netscape-Erweiterung (und damit Mozilla / Firefox), die nicht Teil der ECMAScript-Spezifikation ist und daher nur für bestimmte Browser verwendet werden kann.
quelle
Aus meinem Kopf ...
Funktionen
Argumente.callee bezieht sich auf die Funktion, die die Variable "Argumente" hostet, sodass damit anonyme Funktionen wiederholt werden können:
Das ist nützlich, wenn Sie so etwas tun möchten:
Objekte
Eine interessante Sache über Objektmitglieder: Sie können eine beliebige Zeichenfolge als Namen haben:
Saiten
String.split kann reguläre Ausdrücke als Parameter verwenden:
String.replace kann einen regulären Ausdruck als Suchparameter und eine Funktion als Ersatzparameter verwenden:
quelle
arguments.callee
ist veraltet und wird in ECMAScript 5 eine AusnahmeSie können die meiste Zeit Objekte anstelle von Schaltern verwenden.
Update: Wenn Sie besorgt sind, dass die Fälle, die im Voraus bewertet werden, ineffizient sind (warum machen Sie sich so früh im Programmdesign Sorgen um die Effizienz?), Können Sie Folgendes tun:
Dies ist schwieriger zu tippen (oder zu lesen) als ein Schalter oder ein Objekt, behält jedoch die Vorteile der Verwendung eines Objekts anstelle eines Schalters bei, die im Kommentarbereich unten beschrieben werden. Dieser Stil macht es auch einfacher, dies in eine richtige "Klasse" zu verwandeln, sobald es groß genug ist.
update2: Mit den vorgeschlagenen Syntaxerweiterungen für ES.next wird dies
quelle
var arr = []; typeof arr; // object
Stellen Sie sicher, dass Sie die hasOwnProperty- Methode verwenden, wenn Sie die Eigenschaften eines Objekts durchlaufen:
Dies geschieht so, dass Sie nur auf die direkten Eigenschaften von anObject zugreifen und nicht die Eigenschaften verwenden, die sich in der Prototypenkette befinden.
quelle
Private Variablen mit einer öffentlichen Schnittstelle
Es verwendet einen kleinen Trick mit einer selbstaufrufenden Funktionsdefinition. Alles innerhalb des zurückgegebenen Objekts ist in der öffentlichen Schnittstelle verfügbar, während alles andere privat ist.
quelle