2013-08-04 17 views
7

Ho programmato JS per un sacco di anni e sto ancora trovando nuove scorciatoie per fare le cose. Mi chiedo se ce ne siano altre che non so.idiomi javascript per fare cose comuni

Qui ci sono i tasti di scelta rapida che so di:

Edit: Sono d'accordo che si dovrebbe generalmente non fare questa roba, e che ci potrebbe essere un modo migliore per descriverlo da essere meno ampio, ma la il meglio che posso fare è descriverlo con l'esempio.


Invece di questo

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

fare questo

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

Invece di questo

var foo = Math.floor(2.333) 

fare questo

var foo = ~~2.333 

Invece di questo

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

Fare questo (non grande fan di questo)

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

Invece di questo

if(isNaN(foo) 

fare questo

if(foo != foo) 

Invece di questo

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

fare questo

!function(){ ... }() 

convertire qualsiasi cosa per un valore booleano da prefisso con !!

var isFoo = !!foo 

gioco è fatto, la mia lista di cose da non fare per i vostri colleghi.

È possibile aggiungere qualcos'altro qui?

+0

Le uniche scorciatoie che effettivamente utilizzerei sono '!!' e '+" 1 "'. Il resto ha effetti collaterali indesiderati ('~~ 10000000000000 == 1316134912', per esempio) o semplicemente sembra divertente. – Blender

+0

@mkoryak: stavo parlando più delle operazioni bit a bit, che convertono i tuoi numeri in interi a 32 bit con segno. – Blender

+0

@mkoryak, oltre ad essere "troppo ampio", è necessario utilizzare la casella di controllo "Rispondi alla propria domanda" o spostare la parte risposta su una risposta. – FakeRainBrigand

risposta

2
  • n | 0 piani n (solo se n all'interno del range intero 32-bit). È più veloce di Math.floor() nella maggior parte dei browser l'ultima volta che ho controllato.
  • undefined == null, ma nessuno dei due è uguale a false.
  • Invece di x == 'a' || x == 'b' || x == 'c', si può fare ['a', 'b', 'c'].indexOf(x) !== -1

L'unica scorciatoia veramente poco che ho visto nel codice di produzione è l'unario + per convertire le stringhe in numeri.

11

Questa domanda probabilmente verrà chiusa in quanto troppo ampia, e questa risposta potrebbe raccogliere la giusta quota di downvotes per non rispondere direttamente, ma qui passa.

prega, prega, essere veramente cauti sull'utilizzo di "scorciatoie" in un linguaggio di programmazione, perché ... davvero ... che stanno aiutando?

La maggior parte di queste scorciatoie sacrificano chiarezza e chiarezza per i tasti. Non troverai un programmatore unico, competente e professionale che sarà d'accordo sul fatto che si tratta di un compromesso ragionevole.

consideri

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

a

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

Hai salvato 4 caratteri ... whoopie! Tuttavia, hai anche garantito che chiunque non conosca questa scorciatoia ha una possibilità molto sottile di essere in grado di capire cosa sta succedendo qui ... e certamente non con facilità.

Leggere la definizione di indexOf è sufficiente per comprendere la versione esplicita. Per il secondo, è necessario capire che cosa significa ~ (che è un operatore abbastanza raro in JS). È quindi necessario sapere qual è il complemento bitwise di -1. È quindi necessario rendersi conto che è la verità.

È un fallimento sciocco ed è un segno distintivo di molti di questi idiomi.

Si prega di non farlo. Questo non è gli anni '80.

+3

"Non sono gli anni '80". - oh cacca, le medicine devono essere svanite. Dannazione! (+1 BTW) –

+0

Apprezzo che l'OP li elenchi come "Cose da non fare mai al tuo collega" e lo applaude per questo. – Dancrumb

+0

+1. Avrei scritto questo nella domanda, ma come hai detto, sarà chiuso, più le domande lunghe sono spesso saltate. – mkoryak

2

vedo questo molto:

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

Dovrebbe essere

b = myString.slice(-1); 

Il per ciclo while.

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

a

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

Mettete questo nella parte superiore di uno script.

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

Attiva questi

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

a questi

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

Per quando è necessario mettere 42 nel codice, ma subdolamente.

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

CoffeeScript

... devo aggiungere altro?

+0

Grazie, questo è utile e molto sul tema di ciò che stavo chiedendo. Sì, il coffeescript si rompe :) – mkoryak

+0

Sì, la domanda mi ha appena ricordato un sacco di domande "Allora, quali sono le tue preferite" e in secondo luogo :-) – FakeRainBrigand

+0

Questo 'for (var i = 0, x; (x = a [i ++])! = null;) 'è brillante. Grazie! – user3557327

Problemi correlati