टाइपो नल के मूल्य एक लूप के अंदर क्यों बदलता है?


109

Chrome कंसोल में इस स्निपेट को निष्पादित करना:

function foo() {
    return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());

1000 बार प्रिंट करना चाहिए false, लेकिन कुछ मशीनों पर कई falseपुनरावृत्तियों के लिए प्रिंट होगा , फिर trueबाकी के लिए।

यहां छवि विवरण दर्ज करें

ये क्यों हो रहा है? क्या यह सिर्फ एक बग है?


4
यह मेरे लिए 1000 बार सच हो रहा है ...
Hoàng Long

2
मुझे लगता है कि यह बग है, मेरे पास २६२ असत्य / --३
जैक्सन टेलर

1
यह क्रोम के कंसोल के साथ कुछ अजीब है: यदि आप एक सरणी पर धक्का देते हैं और सरणी को लॉग करते हैं, तो यह सब है false। के रूप में, trueक्रोम में उतार-चढ़ाव की संख्या है ।
डंडविस

1
@ HoàngLong जैसा कि मैंने सवाल में कहा, यह केवल कुछ मशीनों पर होता है। यह भी संभव है कि यह केवल क्रोम के कुछ संस्करणों पर ही हो
अगोस

2
@ HoàngLong सुनिश्चित करें कि आप इसे Chrome
नोबिता

जवाबों:


74

इसके लिए एक क्रोमियम बग खुला है:

अंक 604033 - जेआईटी संकलक विधि व्यवहार को संरक्षित नहीं कर रहा है

तो हाँ, यह सिर्फ एक बग है!


5
"बस"? क्या यह दुनिया भर में वेब अनुप्रयोगों की मनमानी को नहीं तोड़ सकता है?
jpmc26

6
"बस" केवल यह कहने के लिए कि कोई विशेषता या कुछ अजीब नहीं है। एक महत्वपूर्ण बग है, लेकिन सिर्फ एक बग!
स्लम्बर 86

37

यह वास्तव में एक V8 जावास्क्रिप्ट इंजन ( विकी) है ) बग है।

इस इंजन का उपयोग क्रोमियम, मैक्सथ्रॉन, एंड्रॉइड OS, Node.js आदि में किया जाता है।

अपेक्षाकृत सरल बग विवरण आप इस Reddit विषय में पा सकते हैं :

आधुनिक जावास्क्रिप्ट इंजन जेएस कोड को अनुकूलित मशीन कोड में संकलित करता है जब इसे तेजी से चलाने के लिए इसे निष्पादित किया जाता है (बस समय संकलन में)। हालांकि, ऑप्टिमाइज़ेशन स्टेप में लॉन्ग टर्म स्पीडअप के बदले कुछ प्रारंभिक प्रदर्शन लागत होती है, इसलिए इंजन गतिशील रूप से यह तय करता है कि कोई विधि इसके लायक है या नहीं, यह इस बात पर निर्भर करता है कि आमतौर पर इसका उपयोग कैसे किया जाता है।

इस मामले में केवल अनुकूलित पथ में एक बग प्रतीत होता है, जबकि अनधिकृत मार्ग ठीक काम करता है। तो पहली बार में विधि के अनुसार काम करता है, लेकिन अगर यह अक्सर किसी बिंदु पर पर्याप्त रूप से लूप में कहा जाता है, तो इंजन इसे अनुकूलित करने का निर्णय लेगा और इसे छोटी गाड़ी संस्करण के साथ बदल देगा।

इस बग को V8 में ही ( कमिट ), क्रोमियम ( बग रिपोर्ट ) और NodeJS ( कमिट ) के रूप में तय किया गया लगता है ।


मैंने पुष्टि की कि बग अभी भी Node.js 6.2.2 में है जो मुझे चिंतित करता है।
माइकल शोपिन

यह आज (21.06) वी 8 इंजन में तय किया गया था, मुझे विश्वास है कि जल्द ही संबंधित सॉफ्टवेयर अपडेट किया जाएगा।
सर्गेई नोविकोव

V8 को Node.js 6.2.x पर वापस भेजना पहले से ही जारी है क्योंकि TheAlphaNerd के पास # 7348 अंक है ।
माइकल शोपिन

18

यह क्यों बदलता है के प्रत्यक्ष प्रश्न का उत्तर देने के लिए, बग क्रोम द्वारा उपयोग किए जाने वाले V8 JS इंजन के "JIT" अनुकूलन दिनचर्या में है। सबसे पहले, कोड बिल्कुल लिखित रूप में चलाया जाता है, लेकिन जितना अधिक आप इसे चलाते हैं, उतना ही अधिक विश्लेषण की लागतों को पछाड़ने के लिए अनुकूलन के लाभों के लिए है।

इस मामले में, लूप में बार-बार निष्पादन के बाद, जेआईटी कंपाइलर फ़ंक्शन का विश्लेषण करता है, और इसे एक अनुकूलित संस्करण के साथ बदलता है। दुर्भाग्य से, विश्लेषण एक गलत धारणा बनाता है, और अनुकूलित संस्करण वास्तव में सही परिणाम नहीं देता है।

विशेष रूप से, Reddit उपयोगकर्ता RainHappens सुझाव देता है कि यह टाइप प्रचार में एक त्रुटि है :

यह कुछ प्रकार का प्रचार भी करता है (जैसे कि चर आदि किस प्रकार के हो सकते हैं)। एक चर अपरिभाषित या अशक्त होने पर एक विशेष "undetectable" प्रकार होता है। इस मामले में ऑप्टिमाइज़र जाता है "अशक्त undetectable है, इसलिए इसे तुलना के लिए" अपरिभाषित "स्ट्रिंग से बदला जा सकता है।

यह अनुकूलन कोड के साथ कठिन समस्याओं में से एक है: प्रदर्शन के लिए पुनर्व्यवस्थित किए गए उस कोड की गारंटी कैसे करें, मूल के रूप में अभी भी वही प्रभाव होगा।


1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.