См. предыдущую статью для литералов и переменных. Отказ от ответственности тоже есть.
Выражения
- Если все части вашего выражения преобразуются в логические значения или неотрицательные числа, вы можете заменить
&&
и||
на*
и+
:
// Long: d=a&&b||c // Short: d=a*b+c
- Конкатенацию строк можно заменить интерполяцией:
// Long: s='prefix'+a+'infix'+b+'suffix' // Short: s=`prefix${a}infix{$b}suffix`
- Работает даже лучше с более сложными выражениями, так как интерполяция подразумевает круглые скобки:
// Long: s='prefix'+(a+b)+'suffix' // Short: s=`prefix${a+b}suffix`
- Строгие сравнения сохраняют символ:
// Long: for(i=1;i<=50;i++) // Shorter: for(i=1;i<51;i++)
- А изменение кода (если возможно) для замены статической части сравнения на ноль может сделать его еще короче:
// Shorter: for(i=1;i<51;i++) // Shortest: for(i=51;i;i--)
Конверсии
- Целая часть числа:
// Long: Math.floor(n) // Short: ~~n
- Строка в число (основание 10):
// Long: parseInt(s) // Short: +s
- Вроде очевидно, но все же; число в строку (основание 10):
// Long: n.toString(10) // Short: ''+n
- Число в строку (основание 2):
// Just conversion: n.toString(2) // If fixed width is worth additional characters: n.toString(2).padStart(8,0)
- Строка в массив символов:
// Long: a=s.split('') // Short: a=[...s]
Петли
- Обычно стандартный
for
довольно хорош, просто не забывайте, что вы можете использовать запятую, чтобы поместить несколько операций в любой раздел:
for(a=1;a<10;a++) for(a=1,s='',o=[];a<10,s+=a;o.unshift(s),a++)
- Иногда рекурсивная функция с условием выхода лучше, но обычно это происходит, если вы можете повторно использовать функцию несколько раз:
(g=(n,f)=>n?(f(n),g(--n,f)):0)(10,print)
- Есть случаи, когда цикл можно реализовать с помощью регулярных выражений, но опять же, это зависит от специфики случая:
print('123456789'.replace(/./g,c=>c*c+' '))
- Не забывайте про
Array.prototype.map
, особенно хорошо работает сarguments
:
arguments.map(a=>print(a))
- Иногда цикл вообще не нужен, так как короче «скомпилировать» выражение JavaScript в виде строки, а затем вычислить его, например. посмотрите на этот код, который вычисляет сумму цифр:
n=12345 // Long: for(s=0,a=n;a;a/=10)s+=~~a%10 // Short: eval([...''+n].join('+'))
Это все на данный момент.