2016-03-31 13 views
0

今日Google Closure Compilerのプロパティの名前変更に関する問題が見つかりました。Google Closure Compilerでは、一部のプロパティの名前が変更されることはありませんか?

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 


console.info({ 
    foo: 'bar', 
    index: 10, 
    bla: 'x' 
}); 

いつもにコンパイルされます:このコードは、なぜ誰かが私を説明することができれば幸せになる

console.info({b:"bar",index:10,a:"x"}); 

プロパティ「インデックス」いくつかの別の名前に変更されることはありません。問題はなぜですか?それを強制的にリネームする方法は?

+0

これはかなりトリッキーなものです。クロージャコンパイラ開発者の1人によるこの問題コメントは、いくつかの洞察を提供するかもしれません:https://github.com/google/closure-compiler/issues/1054#issuecomment-127026064。 – ach

+0

はい、これはクールですが、Object.prototypeには「インデックス」メンバーはまったくありません。 – Ruslan

+0

@Ruslan FYIこれは意図した動作です。コンパイラは既知のプロパティ名をチェックし、それらの名前を変更しないようにします – user120242

答えて

1

一般に、Closure Compilerはタイプに基づいて名前を変更できます。しかし、それは緩いタイプに直面して後退します。プロトタイププロパティに直接割り当てられていないオブジェクトリテラルは、その緩い型の1つです。ここでは、標準的なexternsに "index"プロパティが存在するため、名前は変更されません。そこいくつかの定義があるが、ここで一つです:

https://github.com/google/closure-compiler/blob/641cf61b99280b8bb4b62ecce873e51208501fec/externs/es3.js#L718

+0

まだObject.prototypeで折りたたまれていない理由はわかりませんが、GCCがこのプロパティがArrayと関係のないインスタンス? – Ruslan

+0

オブジェクトリテラルではあまり重視しません。 – John

0

はちょうどこの「非常にスマートロジック」を理解するための時間を持っていない、私はちょうど他で使用されていない他の何かにこのプロパティの名前を変更しますオブジェクト。

関連する問題