Сполто прав.
Любой ограничитель кода не справится с задачей в одиночку.Вы должны сначала оптимизировать свой код, а затем сделать некоторые грязные ручные настройки.
В дополнение к списку приемов Сполто я хочу поощрять использование логических операторов вместо классического if
else
синтаксиса.пример:
Следующий код
if(condition){
exp1;
}else{
exp2;
}
несколько эквивалентен
condition&&exp1||exp2;
Еще одна вещь, которую следует учитывать, может быть объявление нескольких переменных :
var a = 1;var b = 2;var c = 1;
можно переписать как:
var a=c=1,b=2;
Сполто также прав насчет скобок.Вы должны бросить их.Но кроме того, вы должны знать, что их можно отбросить даже для блоков большего количества выражений, написав выражения, разделенные запятой (конечно, с начальным ; ):
if(condition){
exp1;
exp2;
exp3;
}else{
exp4;
exp5;
}
Может быть переписан как:
if(condition)exp1,exp2,exp3;
else exp4,exp5;
Хотя это не так много (он экономит вам только 1 символ / блок для тех, кто считает), это может пригодиться.(Кстати, последний Google Closure Compiler тоже справляется с этой задачей).
Еще один прием, заслуживающий упоминания, - это противоречивая функциональность with
.
Если вам важнее размер, то вам следует использовать его, поскольку это может уменьшить размер кода.
Например, давайте рассмотрим этоМетод объекта:
object.method=function(){
this.a=this.b;
this.c++;
this.d(this.e);
}
Это может быть переписано как:
object.method=function(){
with(this){
a=b;
c++;
d(e);
}
}
, что в большинстве случаев значительно меньше.
То, что большинство упаковщиков и минификаторов кода не делаютdo заменяет большие повторяющиеся токены в коде на меньшие.Это неприятный хак, который также требует использования eval
, но так как мы находимся в этом для места, я не думаю, что это должно быть проблемой.Допустим, у вас есть этот код:
a=function(){/*code here*/};
b=function(){/*code here*/};
c=function(){/*code here*/};
/*...*/
z=function(){/*code here*/};
В этом коде много "функций" повторяющихся ключевых слов.Что если бы вы могли заменить их одним (неиспользованным) символом, а затем оценить код?
Вот как я бы это сделал:
eval('a=F(){/*codehere*/};b=F(){/*codehere*/};c=F(){/*codehere*/};/*...*/z=F(){/*codehere*/};'.replace(/function/g,'F'));
Конечно, замененный токен может быть любым, посколькунаш код сводится к вычисляемой строке (например: мы могли бы заменить = function () { на F , что позволило бы сохранить еще больше символов).
Обратите внимание, что этот методдолжны использоваться с осторожностью, потому что вы можете легко испортить свой код с несколькими заменами текста;более того, вы должны использовать его только в тех случаях, когда это помогает (например, если у вас есть только 4 function токенов, замена их на меньший токен и последующая оценка кода могут фактически увеличитьдлина кода:
var a = "eval(''.replace(/function/g,'F'))".length,
b = ('function'.length-'F'.length)*4;
alert("you should" + (a<b?"":" NOT") + " use this technique!");