मैंने देखा कि NaN
जब आप {}+{}
कंसोल में टाइप करते हैं तो क्रोम 49 अब आउटपुट नहीं करता है। इसके बजाय यह स्ट्रिंग को आउटपुट करता है [object Object][object Object]
।
ऐसा क्यों है? भाषा बदल दिया?
मैंने देखा कि NaN
जब आप {}+{}
कंसोल में टाइप करते हैं तो क्रोम 49 अब आउटपुट नहीं करता है। इसके बजाय यह स्ट्रिंग को आउटपुट करता है [object Object][object Object]
।
ऐसा क्यों है? भाषा बदल दिया?
जवाबों:
Chrome DevTools अब स्वचालित रूप से सब कुछ है कि के साथ शुरू होता लपेट {
के साथ समाप्त होता है और }
कोष्ठक (का एक अंतर्निहित जोड़ी में कोड देख अभिव्यक्ति के रूप में मूल्यांकन के लिए मजबूर करने),। इस तरह, {}
अब एक खाली वस्तु बनाता है। आप इसे देख सकते हैं यदि आप इतिहास ( ↑) के माध्यम से वापस जाते हैं , तो पिछली पंक्ति में निहित होगी (…)
।
क्यों? मुझे नहीं पता, लेकिन मैं अनुमान लगा सकता हूं कि यह उन newbies के लिए भ्रम को कम करता है जो ब्लॉक-बनाम-ऑब्जेक्ट-शाब्दिक चीज़ के बारे में नहीं जानते हैं, और यह अधिक उपयोगी है यदि आप केवल एक अभिव्यक्ति का मूल्यांकन करना चाहते हैं।
और इस तथ्य है तर्क है कि, के रूप में में चर्चा में बग 499,864 । शुद्ध सुविधा। और क्योंकि नोड आरईपीएल था यह रूप में अच्छी तरह ( कोड देखें )।
{a:1}),({b:2}
एक त्रुटि फेंकना चाहिए, एक वस्तु का उत्पादन नहीं करना चाहिए।
)
टिप्पणी में डाले गए मामले से पहले एक नई पंक्ति जोड़ने पर विचार करें , उदाहरण के लिए {a:3} // :-}
अभी भी एक वस्तु का उत्पादन हो सकता है।
यदि आप इसे चेक करने के बाद ऊपर तीर मारते हैं, तो आप देखेंगे कि इसके बजाय {} + {}
यह प्रदर्शित करता है ({} + {})
, जिसके परिणामस्वरूप "[object Object][object Object]"
।
तुलना में, फ़ायरफ़ॉक्स में, {} + {}
अभी भी प्रदर्शित करता है NaN
, लेकिन अगर आप ({} + {})
इसे प्रदर्शित करते हैं "[object Object][object Object]"
।
तो, ऐसा लगता है कि जब यह ऑपरेशन देखता है तो क्रोम अपने आप में आसपास के कोष्ठक जोड़ रहा है।
{} + {}
जब नहीं "स्वच्छ" करने के लिए ({} + {})
माना जाता है + {}
क्योंकि {}
एक खाली ब्लॉक के रूप में पार्स किया गया है।
{}
केवल एक खाली कोड ब्लॉक है और अवहेलना +{}
किया जाता है, जो हमारे साथ छोड़ रहा है , जो एक यूनीरी +
और एक खाली वस्तु है प्रारंभकर्ता। +
अपने तर्क को संख्या तक ले जाएगा, जिसमें वस्तु को एक आदिम में परिवर्तित करना शामिल है (जो toString
इस मामले में एक होने का परिणाम देगा, जिसके परिणामस्वरूप "[object Object]"
), और इसलिए हम प्राप्त +"[object Object]"
करते हैं, NaN
क्योंकि "[object Object]"
एक वैध संख्या में परिवर्तित नहीं किया जा सकता है।
दुर्भाग्यवश, मैंने खुद क्लीपी को जोड़ा। कंसोल इस बारे में कोई जानकारी नहीं देता है कि उसने आपके लिए क्या किया है।
नए नियम अविश्वसनीय रूप से सरल हैं जो हमें इन 2 कठिन चार्जर्स को लिखने o=
या 0,
ऑब्जेक्ट लिटरेल्स को कंसोल में पेस्ट करने से पहले श्रम की परेशानी से बचा रहे हैं :
{
;{wat:1}),({wat:2}
अंत में फिर से एक त्रुटि है।
{let i=0;var increment=_=>i++}
सही तरीके से अनुमति दी जाती है, अंत में, जो क्लोजर करने का एक अच्छा तरीका है।
हालाँकि, निम्नलिखित गलत तरीके से एक वस्तु है, यह सिर्फ एक सुविधा के रूप में है, जैसा कि @Bergi द्वारा उल्लेख किया गया है, यह JS को आपकी मदद करने के लिए गलत व्याख्या करता है! युक्ति कहती है कि यह एक शाब्दिक "फू" का एक शाब्दिक 1 के साथ एक खंड है जिसे कुछ भी नहीं सौंपा गया है।
{foo:1}
उपरोक्त जैसा होना चाहिए
if(1) {
foo: 1
}
निम्नलिखित को एक ब्लॉक के रूप में सही ढंग से माना जाता है ... क्योंकि इसके सामने एक टिप्पणी है!
//magic comment
{foo:1}
तो यह है:
{foo:1}
//also magic
यह एक वस्तु है:
{foo:
//not so magic comment
1}
यह एक त्रुटि है
//not so magic comment
{foo:1}.foo
तो यह है:
{foo:1}.foo
यह ठीक है:
1..wat
undefined
ऐसा है:
['foo'][0]
अगले एक को अभिव्यक्ति की स्थिति में सही ढंग से व्याख्या की जाती है, 0,
जिसके साथ आमतौर पर यह होता है कि कैसे हम स्पष्ट रूप से यह सुनिश्चित करते हैं कि हमारे पास एक बयान के बजाय एक अभिव्यक्ति हो।
0,{foo:1}.foo
मुझे नहीं लगता कि वे मानों को परगनों में क्यों लपेटते हैं। जेएस के कुछ हास्यास्पद डिजाइन निर्णय हैं, लेकिन इसे बनाने की कोशिश करना इस स्थिति में अच्छे व्यवहार का विकल्प नहीं है, कंसोल को जेएस को सही ढंग से चलाने की आवश्यकता है, और हमें आश्वस्त होने की आवश्यकता है कि क्रोम सिर्फ अनुमान नहीं लगा रहा है कि यह हमें लगता है कि वास्तव में इसका मतलब कुछ और करना था।
यदि आपको अल्पविराम ऑपरेटर पसंद नहीं है तो आप असाइनमेंट का उपयोग कर सकते हैं
x = {foo:1}.foo
क्योंकि जैसा वह खड़ा है
{} + {} + {}
"[object Object][object Object][object Object]"
;{} + {} + {}
"NaN[object Object]"
पागल और सुसंगत मैं इससे निपट सकता हूं ... पागल और असंगत कोई धन्यवाद नहीं!
{foo:1}
और {foo:1}//
एक ही चीज का उत्पादन। Chrome JS REPL में वे नहीं हैं। REPL केवल JS का मूल्यांकन करने से अधिक कर रहा है। यह स्ट्रिंग्स को प्रोसेस कर रहा है और विभिन्न चीजों को तय कर रहा है।
var x = eval('{a:1}')
मान्य JavaScript x में अब 1 है, न कि अधिक सहज वस्तु {a: 1}। हाँ, यह अजीब है, लेकिन आप सिर्फ भाषा नहीं बदल सकते क्योंकि यह अजीब चीजें करता है। JSON स्ट्रिंग्स के अलावा अन्य सभी चीज़ों की व्याख्या जावास्क्रिप्ट के रूप में की जाती है और उनका मूल्यांकन किया जाता है। 0,
JSON को चिपकाने से पहले टाइप करना मुश्किल नहीं है, वैकल्पिक रूप से मुझे चेतावनी के साथ खुशी होगी कि स्ट्रिंग को सुविधा के लिए जावास्क्रिप्ट के बजाय एक ऑब्जेक्ट के रूप में व्याख्या किया गया था।
var e = {}; e.toString()
और आप देखेंगे कि मेरा क्या मतलब है