誰かが興味を持っているかどうかはわかりませんが、今日は140バイトに詰め込まれたDeepCloneという奇跡を作りました。
すでにこれを行って断食している場合は、鼻を突いてください。 ツイート形式では浅いコピーしか見つかりませんでした。 まあ、私は適用されたハックが禁止された
欠点のうち、jQueryのextend関数を使用した複製と同じです。ブール、文字列、日付型の標準オブジェクトを食べず、プロトタイプとコンストラクタを無視し、リングにハングアップします。
尊厳は1つであり、ほとんどの場合、純粋に美的である-サイズ。
Firefox、Chromium、Opera、IE8、およびデフォルトのAndroidブラウザでテスト済み。
カットの下-コードとそれがどのように機能するかについての短い物語。
まず、読みやすいバージョン(140バイトが圧縮されていないためdupと呼ばれます):
function dup(o) { // "string", number, boolean if(typeof(o) != "object") { return o; } // null if(!o) { return o; // null } var r = (o instanceof Array) ? [] : {}; for(var i in o) { if(o.hasOwnProperty(i)) { r[i] = dup(o[i]); } } return r; }
ここで何が起こっていますか:
オブジェクトが単純(文字列、数値、ブール値)の場合、それを返すだけで、オブジェクトがnullでないことを確認します(typeof(null)も==“ object”)。 次に、結果(配列またはオブジェクト)を作成し、プロパティを実行して、再帰的に複製します。
一般的に、すべては簡単です。 これで、ほぼ300バイトを2回圧縮する必要があります。
私たちは私たちを助けるいくつかのことを思い出します:
-typeofは演算子であり、括弧は必要ありません。
-y ?:優先度が最も低いため、左側の括弧は省略できます。
-null && {}はnull、obj && {}はobj;
-for(nullのvar i)は、1回の反復を行わずにエラーなしでパスします。
-関数のパラメーターも変数ですが、それらをすべて転送することは完全にオプションです。 これにより、varという単語の4バイトをスペースで節約できます。
これに基づいて、以下を取得します。
function dup(o,i,r) { if(typeof o != "object") return o; r = o instanceof Array ? [] : o&&{}; for(i in o) if(o.hasOwnProperty(i)) r[i] = dup(o[i]); return r }
まあ、または1行(139文字)で:
function dup(o,i,r){if(typeof o!="object")return o;r=o instanceof Array?[]:o&&{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i]);return r}
許容サイズを150文字に増やした場合は、リンクの処理を自分自身に追加することもできます(もちろん、リングを完全に破壊するのではなく、少なくとも何か):
r[i] = (o[i] === o) ? r : dup(o[i]);
または:
function dup(o,i,r){if(typeof o!="object")return o;r=o instanceof Array?[]:o&&{};for(i in o)if(o.hasOwnProperty(i))r[i]=o[i]===o?r:dup(o[i]);return r}
デモ: pastehtml.com/view/buikhdvfe.html ( pastehtmlからラッパーなしで表示するには、リンクの単語「view」を「raw」に置き換えます)
UPD:
TheShockのおかげで、機能はまだ少し薄くなっています!
オプションは次のとおりです。
function dup(o,i,r) { r=o; if(r && typeof o == "object") { r = o instanceof Array ? [] : {}; for(i in o) if(o.hasOwnProperty(i)) r[i] = dup(o[i]); } return r } // 135 function dup(o,i,r){r=o;if(r&&typeof o=="object"){r=o instanceof Array?[]:{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i])}return r} // ie8, 133 : function dup(o,i,r){r=o;if(r&&typeof o=="object"){r=Array.isArray(o)?[]:{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i])}return r}
また、次の場合を排除して、別のバイトを保存する方法に関するmark_ablovからの追加の提案がありました。
o.hasOwnProperty(i)?r[i]=dup(o[i]):1
UPD 2:
そして、このアイデアの最終的な開発は、再びTheShockからです :
function c(o,i,r){if(o&&typeof o=="object"){r=o instanceof Array?[]:{};for(i in o)o.hasOwnProperty(i)?r[i]=o[i]===o?r:c(o[i]):0}return r||o}
正確に140バイトの純粋なwin'aで、IE8で動作し、リングの最小チェックを行います!
ほら、仲間!
要点: gist.github.com/2369704
更新されたデモ: pastehtml.com/view/buiv8lzka.html
UPD 3.4:究極の武器
実際の使用のために、私はツイートに収まらない(穏やかに)別のバージョンを作成しましたが、日付とオブジェクトラッパーで動作し、ループと内部リンクも完全に解決します。 単一行バージョンは328バイトかかります。
また、マルチフレームとインスタンスの問題を完全に忘れてしまったので、私は珍しいエキセントリックだと気づきました。 さて、戦闘版では、これも現在決定されています。
ここの要点: gist.github.com/0d3e6ce689e76105f3ef
デモはこちら: pastehtml.com/view/bumpwvs4q.html