2012-12-04 19 views
8

मैंने देखा है कि Google क्लोजर कंपाइलर अगर-क्लॉज में बहुत सी पुनर्लेखन करता है। उदाहरण के लिए:Google क्लोजर तर्क स्वैप क्यों करता है?

if (a === 3) {…} 

को

if (3 === a) {…} 

जावास्क्रिप्ट में तेजी से तुलना कर रहे हैं बदल जाता है, अगर आदिम पहला तर्क है, या इस का कारण क्या है?

+8

Google को योड पसंद है :) –

+0

शायद आप यहां यह पूछने के बेहतर होंगे: https://groups.google.com/forum/?fromgroups#!forum/closure-compiler-discuss –

+1

यदि कोई प्रदर्शन लाभ है , यह कम से कम क्रोम में नगण्य है: http://jsperf.com/yoda –

उत्तर

16

ReorderConstantExpression.java से:

/** 
* Reorder constant expression hoping for a better compression. 
* ex. x === 0 -> 0 === x 
* After reordering, expressions like 0 === x and 0 === y may have higher 
* compression together than their original counterparts. 
* 
*/ 

के रूप में एक google closure compiler contributor ने कहा, संपीड़न कोड टिप्पणी साधन gzip संपीड़न की बात कर रहे, न कि वास्तविक minification "संपीड़न"। जीजीआईपी संपीड़न में सुधार करने का कारण यह है कि यदि आपके कोड में 0 === x और x === 0 है, तो क्लोजर कंपाइलर इन दोनों को 0 === x पर सामान्यीकृत करता है, जो डुप्लिकेट टेक्स्ट है और इस प्रकार बेहतर संपीड़ित होता है।

तो फिर वहाँ भी है:

typeof this.value == "object" 

typeof this.key == "object" 

अद्वितीय तार कर रहे हैं: typeof this., value, key और == "object"

लेकिन अगर आप को पुन: व्यवस्थित:

"object" == typeof this.value 

"object" == typeof this.key 

अद्वितीय तार कर रहे हैं: "object" == typeof this. , value और key। कम अद्वितीय तार और काफी लंबे डुप्लिकेट एक।

+0

उत्कृष्ट, अच्छा एक। कोई पूर्ण विवरण के लिए कामना कर सकता था (टिप्पणी में, आपसे नहीं), लेकिन कम से कम * कुछ * है। गंभीर खुदाई –

+0

+1। मुझे स्रोत कोड के हिस्से से प्यार है जो कहता है कि यह 'सारिपीपोहोल ऑप्टिमाइज़ेशन' बढ़ाता है :) –

+2

+1 के लिए –