क्यों {} + {} सांत्वना नहीं रह गया है NaN क्रोम में है?


144

मैंने देखा कि NaNजब आप {}+{}कंसोल में टाइप करते हैं तो क्रोम 49 अब आउटपुट नहीं करता है। इसके बजाय यह स्ट्रिंग को आउटपुट करता है [object Object][object Object]

ऐसा क्यों है? भाषा बदल दिया?


13
क्रोम की तरह दिखता है अब एक स्ट्रिंग concat के बजाय अतिरिक्त के रूप में इस कार्रवाई को व्यवहार करता है। वह क्यों है, मुझे नहीं पता, यही कारण है कि यह एक टिप्पणी है एक जवाब नहीं :) कोशिश करो var e = {}; e.toString()और आप देखेंगे कि मेरा क्या मतलब है
user428517

19
"क्या भाषा बदल गई?" सं
फेलिक्स Kling

6
@FelixKling क्या भाषा बदल जाएगी? ...नहीं। : c
बिल्ली

18
शायद वाटमैन के पास कुछ करने के लिए था?
रिकस्टर

1
@rickster है कि मैं इसे कैसे पाया। मैं एक प्रस्तुति के लिए इसे फिर से बना रहा था।
फिलीप हगलुंड

जवाबों:


152

Chrome DevTools अब स्वचालित रूप से सब कुछ है कि के साथ शुरू होता लपेट {के साथ समाप्त होता है और }कोष्ठक (का एक अंतर्निहित जोड़ी में कोड देख अभिव्यक्ति के रूप में मूल्यांकन के लिए मजबूर करने),। इस तरह, {}अब एक खाली वस्तु बनाता है। आप इसे देख सकते हैं यदि आप इतिहास ( ) के माध्यम से वापस जाते हैं , तो पिछली पंक्ति में निहित होगी (…)

क्यों? मुझे नहीं पता, लेकिन मैं अनुमान लगा सकता हूं कि यह उन newbies के लिए भ्रम को कम करता है जो ब्लॉक-बनाम-ऑब्जेक्ट-शाब्दिक चीज़ के बारे में नहीं जानते हैं, और यह अधिक उपयोगी है यदि आप केवल एक अभिव्यक्ति का मूल्यांकन करना चाहते हैं।

और इस तथ्य है तर्क है कि, के रूप में में चर्चा में बग 499,864 । शुद्ध सुविधा। और क्योंकि नोड आरईपीएल था यह रूप में अच्छी तरह ( कोड देखें )।


182
स्टुपिड क्रोम, {a:1}),({b:2}एक त्रुटि फेंकना चाहिए, एक वस्तु का उत्पादन नहीं करना चाहिए।
ओरिओल

29
ऐसा तब होता है जब आप regex stackoverflow.com/questions/1732348/… के
फिलिप हाग्लंड

4
मुझे पता नहीं क्यों, लेकिन किसी तरह जब मैं अपने संदेशों को देखता हूं तो मुझे "प्रसिद्ध" लगता है, हालांकि वह पृष्ठ इस रूप में सार्वजनिक है: डी वेर्ड स्टैकऑवरफ्लो समस्या। यहाँ समस्या के बारे में मेरा पुराना जवाब है stackoverflow.com/questions/17268468/…
बेंजामिन Gruenbaum

3
मुझे वर्तमान कार्यान्वयन पसंद नहीं है और इसे ठीक करने की योजना है। Bugs.chromium.org/p/chromium/issues/detail?id=499864#c17
Zirak

1
@Zirak सौभाग्य उस बकवास को ठीक करना, IMO यह ASAP को वापस होना चाहिए। लेकिन अगर आप इसे सुधारना चाहते हैं, तो )टिप्पणी में डाले गए मामले से पहले एक नई पंक्ति जोड़ने पर विचार करें , उदाहरण के लिए {a:3} // :-}अभी भी एक वस्तु का उत्पादन हो सकता है।
Oriol

44

यदि आप इसे चेक करने के बाद ऊपर तीर मारते हैं, तो आप देखेंगे कि इसके बजाय {} + {}यह प्रदर्शित करता है ({} + {}), जिसके परिणामस्वरूप "[object Object][object Object]"

तुलना में, फ़ायरफ़ॉक्स में, {} + {}अभी भी प्रदर्शित करता है NaN, लेकिन अगर आप ({} + {})इसे प्रदर्शित करते हैं "[object Object][object Object]"

तो, ऐसा लगता है कि जब यह ऑपरेशन देखता है तो क्रोम अपने आप में आसपास के कोष्ठक जोड़ रहा है।


22
यह उत्तर सही है। लेकिन वाह, यार, मुझे यकीन नहीं है कि मुझे पसंद है कि क्रोम ऐसा करता है। बुरा गूगल।
user428517

1
@sgroves मुझे यह देखने में दिलचस्पी होगी कि क्या यह कैनरी में समान है, और यदि यह उद्देश्य पर किया गया था या वास्तव में बग है।
जे। टाइटस

8
{} + {}जब नहीं "स्वच्छ" करने के लिए ({} + {})माना जाता है + {}क्योंकि {}एक खाली ब्लॉक के रूप में पार्स किया गया है।
ग्रेगरी निस्बेट

7
यह NaN को पहले स्थान पर क्यों लौटाएगा?
0x499602D2

25
@ 0x499602D2: क्योंकि जब तक आप पार्न्स नहीं करते हैं (या अन्यथा पार्सर को बयान के बजाय अभिव्यक्ति की अपेक्षा में स्थानांतरित करने का कारण बनता है), प्रारंभिक {}केवल एक खाली कोड ब्लॉक है और अवहेलना +{}किया जाता है, जो हमारे साथ छोड़ रहा है , जो एक यूनीरी +और एक खाली वस्तु है प्रारंभकर्ता। +अपने तर्क को संख्या तक ले जाएगा, जिसमें वस्तु को एक आदिम में परिवर्तित करना शामिल है (जो toStringइस मामले में एक होने का परिणाम देगा, जिसके परिणामस्वरूप "[object Object]"), और इसलिए हम प्राप्त +"[object Object]"करते हैं, NaNक्योंकि "[object Object]"एक वैध संख्या में परिवर्तित नहीं किया जा सकता है।
टीजे क्राउडर

4

कंसोल के संबंध में Chrome 54 के रूप में:

📎- "मैंने उस ब्लॉक को आपके लिए ऑब्जेक्ट में बदल दिया" -Clippy दुर्भाग्यवश, मैंने खुद क्लीपी को जोड़ा। कंसोल इस बारे में कोई जानकारी नहीं देता है कि उसने आपके लिए क्या किया है।

नए नियम अविश्वसनीय रूप से सरल हैं जो हमें इन 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]"

पागल और सुसंगत मैं इससे निपट सकता हूं ... पागल और असंगत कोई धन्यवाद नहीं!


एक REPL यह एक REPL भाषा नहीं है। यह अन्य चीजों के बीच भाषा के लिए तार गुजरता है । यहां ऐसी कई चीजें हैं जो Chrome REPL करती है, जो भाषा स्वयं नहीं करती है । वे बहुत उपयोगी हैं, इसलिए मुझे खुशी है कि वे सीधे सादे भाषा से नहीं चिपके।
gman

@gman A REPL एक स्ट्रिंग पढ़ता है, इसका मूल्यांकन करता है, परिणामों को प्रिंट करता है और फिर डायनामिक कोड के अगले टुकड़े को पढ़ने की तैयारी करता है। लिंक किए गए पृष्ठ में कुछ भी अमान्य जावास्क्रिप्ट नहीं था। कंसोल संदर्भ में "$ _" चर स्पष्ट रूप से एक सुविधा है जो केवल एक REPL में समझ में आता है। बहरहाल, "$ _" एक वैध चर नाम है, बाकी सामान्य जावास्क्रिप्ट के साथ लागू किए गए सामान्य कार्य और कक्षाएं हैं।
जेम्स वेकफील्ड

यकीन नहीं होता कि आपकी बात क्या है। मेरी बात यह है कि भाषा एक चीज है, जिस वातावरण में वह चलती है वह एक और है। आपने अपने उत्तर में एक उदाहरण दिया। जेएस में {foo:1}और {foo:1}//एक ही चीज का उत्पादन। Chrome JS REPL में वे नहीं हैं। REPL केवल JS का मूल्यांकन करने से अधिक कर रहा है। यह स्ट्रिंग्स को प्रोसेस कर रहा है और विभिन्न चीजों को तय कर रहा है।
GMAN

var x = eval('{a:1}')मान्य JavaScript x में अब 1 है, न कि अधिक सहज वस्तु {a: 1}। हाँ, यह अजीब है, लेकिन आप सिर्फ भाषा नहीं बदल सकते क्योंकि यह अजीब चीजें करता है। JSON स्ट्रिंग्स के अलावा अन्य सभी चीज़ों की व्याख्या जावास्क्रिप्ट के रूप में की जाती है और उनका मूल्यांकन किया जाता है। 0,JSON को चिपकाने से पहले टाइप करना मुश्किल नहीं है, वैकल्पिक रूप से मुझे चेतावनी के साथ खुशी होगी कि स्ट्रिंग को सुविधा के लिए जावास्क्रिप्ट के बजाय एक ऑब्जेक्ट के रूप में व्याख्या किया गया था।
जेम्स वेकफील्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.