2013-08-04 16 views
7

Ich habe JS für eine Reihe von Jahren programmiert und ich finde immer noch neue Verknüpfungen für Dinge zu tun. Ich frage mich, ob es mehr gibt, von denen ich nichts weiß.JavaScript-Idiome für gemeinsame Dinge

Hier sind die Abkürzungen, die ich kennen:

bearbeiten: Ich bin damit einverstanden, dass Sie das Zeug der Regel nie tun sollten, und dass es könnte ein besserer Weg, es zu beschreiben, wie weniger breit zu sein, aber die Ich kann es am besten beschreiben.


Statt dieser

if("foobar".indexOf("foo") > -1) 

Tun Sie dies

if(~"foobar".indexOf("foo")) 

Statt dieser

var foo = Math.floor(2.333) 

dies tun

var foo = ~~2.333 

Statt dessen

var foo = parseFloat("12.4") 
var bar = parseInt("12", 10) 

Tun Sie dies (nicht großer Fan von diesem)

var foo = +"12.4" 
var bar = +"12" 

Statt dessen

if(isNaN(foo) 

Tun Sie dies

if(foo != foo) 

Statt dieser

(function(){ ... ])() 

Tun Sie dies

!function(){ ... }() 

alles zu einem boolean Konvertieren von meiner Liste der Dinge voran es mit !!

var isFoo = !!foo 

Da haben Sie es, nie auf Ihre Mitarbeiter zu tun.

Kann hier noch etwas hinzugefügt werden?

+0

Die einzigen Verknüpfungen, die ich tatsächlich verwenden würde, sind '!!' und '+" 1 "'. Der Rest hat unbeabsichtigte Nebenwirkungen (zum Beispiel "~~ 10000000000000 == 1316134912") oder einfach nur komisch aussehen. – Blender

+0

@mkoryak: Ich habe mehr über die bitweisen Operationen gesprochen, die Ihre Zahlen in vorzeichenbehaftete 32-Bit-Ganzzahlen konvertieren werden. – Blender

+0

@mkoryak, neben "zu breit", sollten Sie das Kontrollkästchen "Eigene Frage beantworten", oder verschieben Sie den Antwortteil zu einer Antwort. – FakeRainBrigand

Antwort

2
  • n | 0 Böden n (nur wenn n innerhalb des signierten 32-Bit-Integer-Bereich). Es ist schneller als Math.floor() in den meisten Browsern zuletzt habe ich überprüft.
  • undefined == null, aber keine sind gleich false.
  • Statt x == 'a' || x == 'b' || x == 'c' können Sie ['a', 'b', 'c'].indexOf(x) !== -1

Das tun nur wirklich kurze Verknüpfung, die ich in der Produktion Code gesehen habe, ist die einstellige + Strings in Zahlen zu konvertieren.

11

Diese Frage wird wahrscheinlich als zu weit geschlossen, und diese Antwort kann seinen fairen Anteil von Downvotes sammeln, weil sie nicht direkt antwortet, aber hier geht es.

Bitte, bitte, sein wirklich umsichtig über "Abkürzungen" in einer Programmiersprache, weil ... wirklich ..., die helfen sie?

Die meisten dieser Abkürzungen opfern Klarheit und Deutlichkeit für Tastenanschläge. Sie werden keinen einzigen, kompetenten, professionellen Programmierer finden, der zustimmen wird, dass dies ein vernünftiger Kompromiss ist.

Betrachten

if("foobar".indexOf("foo") > -1) 

zu

if(~"foobar".indexOf("foo")) 

Sie haben 4 Zeichen gespeichert ... Whoopie! Sie haben jedoch auch garantiert, dass jeder, der diese Abkürzung nicht kennt, eine sehr geringe Chance hat, herauszufinden, was hier vor sich geht ... und sicherlich nicht mit Leichtigkeit.

Das Lesen der Definition von indexOf ist genug, um die explizite Version zu verstehen. Für die zweite müssen Sie verstehen, was ~ bedeutet (was ein ziemlich ungewöhnlicher Operator in JS ist). Sie müssen dann wissen, was das bitweise Komplement von -1 ist. Sie müssen dann erkennen, dass es truthy ist.

Es ist eine törichte Abwägung und es ist ein Kennzeichen vieler dieser Idiome.

Bitte tun Sie es nicht. Das ist nicht die 80er Jahre.

+3

"Das ist nicht die 80er." - oh kacke, die Drogen müssen abgenutzt sein. Teufel noch mal! (+1 BTW) –

+0

Ich schätze, dass das OP sie als "Dinge, die man seinem Kollegen niemals antut" auflistet und ihn dafür applaudiert. – Dancrumb

+0

+1. Ich hätte dies in der Frage geschrieben, aber wie du gesagt hast, wird es geschlossen, und lange Fragen werden oft übersprungen. – mkoryak

2

Ich sehe das man viel:

myString = "Some string." 
b = myString[myString.length - 1]; // get the period 

sein sollte
b = myString.slice(-1); 

Die für while-Schleife.

for (var i=0; i < a.length; i++) { 
    var x = a[i]; 
    console.log(x); 
} 

zu

for (var i=0,x; (x=a[i++]) != null;) { 
    console.log(x); 
} 

an der Spitze eines Skripts Setzen Sie diese.

String.prototype.has = Array.prototype.has = function(a){ return this.indexOf(a) !== -1; } 

Schaltet diese

if (myString.indexOf(a) !== -1) 
if (myArray.indexOf(a) !== -1) 

auf diese

if (myString.has(a)) 
if (myArray.has(a)) 

Denn wenn Sie brauchen 42 im Code zu setzen, aber schleichend.

var answer = ((((1<<2)|1)<<2)|1)<<1; 

Coffee

... muss ich noch mehr sagen?

+0

Danke, das ist nützlich und sehr viel zum Thema von dem, was ich gefragt habe. Ja coffeescript rockt :) – mkoryak

+0

Ja, die Frage hat mich gerade an viele "So, das ist deine Lieblings" -Fragen zuerst erinnert, und zweite Blicke :-) – FakeRainBrigand

+0

Das 'für (var i = 0, x; (x = a [i ++])! = null;) 'ist brilliant. Vielen Dank! – user3557327

Verwandte Themen