• ベストアンサー

JavaScriptの手動圧縮

yuicompressorや、packerを使用するのを前提として、 手動で、以下のような記述で、更にごくわずかではありますが、圧縮できるのですが、 これ以外にも、同じ機能で記述を変えるだけで、サイズが小さくなるのは あるでしょうか? Math.floor → ~~ typeof hoge === "undefined" → hoge === void(0) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.1

void(0)をvoid 0にすれば1文字削減できますよね あと function X(a,b,c){ if(hoge === void 0){} } のような形なら function X(a,b,c,u){ if(hoge === u){} } とすれば更に3文字削減できますね まあこのようにサイズを無理矢理に削ろうとすると たいていパフォーマンスも落ちますし読みにくくなります それに落とし穴になったりします 例えばMath.floorと~~は同じ機能ではありません Math.floor(9876543210)は9876543210ですが、~~9876543210は1286608618です それからtypeofを省いた場合も効果がケースにより異なります それらがなぜそうなるのかが分からないうちはやらない方がいいでしょう それを気にしないのであればいくらでも考えられます 空白や{}をなくして詰めたりする作業はツールに任せるのなら withを使ったりforをforinに置き換えたり多少大規模なことをやるとごっそり減らせます 細かいことなら数値化をn=+"123"でやったりですかね

ymda
質問者

お礼

>void(0)をvoid 0にすれば1文字削減できますよね これだけで、jQuery 1.8.0(圧縮済)が10バイト減りました。 >function X(a,b,c){ >if(hoge === void 0){} >} >のような形なら >function X(a,b,c,u){ >if(hoge === u){} >} この形は(意味のない引数)始めて知りました。 ですが、自動化をしていますと、void 0のが少々手軽かな?というのがありますので 手動で書き換えるしかないですね。 (詳細は補足欄にて) >例えばMath.floorと~~は同じ機能ではありません >Math.floor(9876543210)は9876543210ですが、~~9876543210は1286608618です ご指摘ありがとうございます。 危ない線を走る所でしたが、今回は、Math.floor の代替処理は、乱数の整数化以外には 使用していませんので、とりあえずは大丈夫かと思います。 >withを使ったりforをforin 少しはあるものの、withを使って効果があるものが思ったよりない感じがしています。 ですが、数か所、使えそうな所がありますので、試してみます。 >細かいことなら数値化をn=+"123"でやったりですかね aaa=aaa+"abc"; aaa=aaa+"def"; (以下、数10行) を aaa+="abc" +"def"; をまとめたことがある程度でしょうか。

ymda
質問者

補足

yuicompressorとpackerの混合での圧縮後コードを こちらにかいてみます。 圧縮したコードの比較は、以下のようになります。 function a() { var a=0; return void(0); } function b() { var a=1; return void(0); } function c() { var a=2; return void(0); } eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('7 a(){6 5=0;4 3(0)}7 9(){6 5=1;4 3(0)}7 8(){6 5=2;4 3(0)};',11,11,'|||void|return|d|var|function|c|b|'.split('|'))) >「4 3(0)」 = void(0) function a() { var a=0; return void 0; } function b() { var a=1; return void 0; } function c() { var a=2; return void 0; } eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('7 a(){6 5=0;4 3 0}7 9(){6 5=1;4 3 0}7 8(){6 5=2;4 3 0};',11,11,'|||void|return|d|var|function|c|b|'.split('|'))) >「4 3 0」=void 0 function a(u) { var a=0; return u; } function b(u) { var a=1; return u; } function c(u) { var a=2; return u; } eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('7 a(3){6 5=0;4 3}7 9(3){6 5=1;4 3}7 8(3){6 5=2;4 3};',11,11,'|||e|return|d|var|function|c|b|'.split('|'))) >「4 3」=return u p.s.この程度だけですと、サイズが小さすぎるので、packerを使うとサイズが増えますが、それなりの規模のJSを作ったとして仮定しています。

関連するQ&A

専門家に質問してみよう