2013-08-04 14 views
7

Programowałem JS od paru lat i wciąż znajduję nowe skróty do robienia rzeczy. Zastanawiam się, czy jest ich więcej, o których nie wiem.Idiomy javascript do robienia zwykłych rzeczy

Oto skróty wiem o:

edycji: Zgadzam się, że należy generalnie nigdy robić te rzeczy, i że nie może być lepszy sposób, aby opisać to, aby były mniej szerokie, ale najlepiej mogę to opisać za pomocą przykładu.


Zamiast tego

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

Czy ta

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

Zamiast tego

var foo = Math.floor(2.333) 

Czy ta

var foo = ~~2.333 

Zamiast tego

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

zrobić (nie wielkim fanem tego jednego)

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

Zamiast tego

if(isNaN(foo) 

Czy ta

if(foo != foo) 

Zamiast tego

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

Czy ta

!function(){ ... }() 

Konwersja nic do wartości logicznej przez poprzedzenie !!

var isFoo = !!foo 

masz to, moja lista rzeczy do zrobienia nigdy do swoich współpracowników.

Czy można dodać coś jeszcze?

+0

Jedyne skróty, których bym użył to "!!" i "+" 1 ". Reszta ma niezamierzone efekty uboczne (na przykład ~~~ 10000000000000 == 1316134912') lub po prostu wyglądają śmiesznie. – Blender

+0

@mkoryak: Mówiłem więcej o operacjach bitowych, które zamieniają twoje liczby na 32-bitowe liczby całkowite ze znakiem. – Blender

+0

@mkoryak, oprócz bycia "zbyt szerokim", należy użyć pola wyboru "Odpowiedz na własne pytanie" lub przenieść część odpowiedzi na odpowiedź. – FakeRainBrigand

Odpowiedz

2
  • n | 0 podłogi n (gdy n mieści się w 32-bitowej przedziale całkowita). Jest on szybszy niż w większości przeglądarek, ostatnio sprawdzałem.
  • undefined == null, ale żadna z nich nie jest równa false.
  • Zamiast x == 'a' || x == 'b' || x == 'c' można zrobić ['a', 'b', 'c'].indexOf(x) !== -1

Jedynym naprawdę krótki skrót, który widziałem w kodzie produkcyjnym jest jednoargumentowych + przekonwertować ciągi do liczb.

11

To pytanie prawdopodobnie zostanie zamknięte jako zbyt szerokie, a ta odpowiedź może zebrać spory udział w grach, ponieważ nie odpowiada bezpośrednio, ale tutaj jest.

Proszę, proszę, być naprawdę ostrożny o używaniu „skróty” w języku programowania, ponieważ ... naprawdę ... Kim są one pomagać?

Większość tych skrótów poświęca klarowność i jasność klawiszy. Nie znajdziesz ani jednego, kompetentnego, profesjonalnego programisty, który zgodzi się, że to rozsądny kompromis.

Rozważmy

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

do

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

Uratowałeś 4 znaki ... whoopie! Masz jednak gwarancję, że każdy, kto nie zna tego skrótu, ma bardzo nikłą szansę, aby dowiedzieć się, co się tutaj dzieje ... a na pewno nie z łatwością.

Przeczytanie definicji indexOf wystarczy, aby zrozumieć wersję jawną. Po drugie, musisz zrozumieć, co oznacza ~ (co jest dość niecodziennym operatorem w JS). Następnie musisz wiedzieć, co to jest bitowe uzupełnienie -1. Musisz wtedy zrozumieć, że jest to prawda.

To głupi kompromis i jest znakiem rozpoznawczym wielu z tych idiomów.

Nie rób tego. To nie lata 80-te.

+3

"To nie lata 80." - o, kupie, narkotyki musiały się wyczerpać. Cholera! (+1 BTW) –

+0

Doceniam to, że OP wymienia je jako "rzeczy, których nigdy nie można zrobić swojemu współpracownikowi" i za to go oklaskiwuje. – Dancrumb

+0

+1. Napisałbym to w pytaniu, ale jak powiedziałeś, będzie ono zamknięte, a długie pytania są często pomijane. – mkoryak

2

widzę to można wiele:

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

Powinny być

b = myString.slice(-1); 

dla pętli while.

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

do

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

Umieścić to w górnej części skryptu.

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

Okazuje te

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

do tych

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

Do kiedy trzeba umieścić 42 w kodzie, ale podstępnie.

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

coffeescript

... co więcej powiedzieć?

+0

Dzięki, jest to przydatne i bardzo na temat tego, o co prosiłem. Yes coffeescript rocks :) – mkoryak

+0

Tak, to pytanie właśnie przypomniało mi wiele pytań "Tak, to jest twoje ulubione" na początku i drugie spojrzenie :-) – FakeRainBrigand

+0

To 'for (var i = 0, x; (x = a [i ++])! = null;) 'jest genialny. Dzięki! – user3557327

Powiązane problemy