0. -5 मूल्यांकन -5 क्यों करता है?


84

मान लीजिए मैं लिखने 0.5के रूप में 0.-5अप्रत्याशित तरीके से, लेकिन यह अभी भी चला सकते हैं। ऐसा क्या करता 0.है 0.-5कि यह अभी भी चल सकता है और -5 का मूल्यांकन कर सकता है?

मैंने यह भी कोशिश की alert(0.-5+1)कि कौन सा प्रिंट -4, जावास्क्रिप्ट को अनदेखा करता 0.है 0.-5?


55
0.की तरह है 0.0। या बस 0
Ry-

61
आपको क्या लगता है कि 0.-5यह "अप्रत्याशित तरीका" है?
निको हासे

15
@ नोइहॉसे: मुझे पूरा यकीन है कि ओपी ने "अप्रत्याशित तरीके से" का इस्तेमाल किया, जिसका अर्थ है "मैं ऐसा लिखने का इरादा नहीं करता / अपेक्षा करता था, लेकिन किसी तरह मैंने किया"।
फिलिप मिलोवानोविक

15
यह कई अन्य भाषाओं में भी काम करता है (उदाहरण पायथन)। मुझे व्यक्तिगत रूप से यह बिल्कुल पसंद नहीं है। मैं बल्कि 0.-5एक वाक्यविन्यास त्रुटि होगी और एक अनुगामी अवधि के साथ फ्लोट शाब्दिक अनुमति नहीं है, लेकिन लोगों को .0अंत में लिखने के लिए मजबूर करता हूं ।
गियाकोमो अल्जेटा

9
यह विशेष रूप से बुरा है क्योंकि संख्याओं को समाप्त करने की अनुमति .आपको कुछ लिखने से रोकती है 123.toString(16)(एक सामान्य चाल का उपयोग करना है 123..toString(16), जो वास्तव में है (123.).toString(16))
12M2121

जवाबों:


191

.वैकल्पिक होने के बाद अनुगामी अंक :

console.log(0. === 0); // true

इसलिए

0.-5

करने के लिए evalutes

0 - 5

जो बस है -5। इसी तरह,

0.-5+1

है

0 - 5 + 1

जो है

-5 + 1

या -4


16
अग्रणी अंक भी वैकल्पिक हैं, इसलिए .0-5 भी मान्य है
icenac

48

0.-5सफलतापूर्वक 0.[1] , -और के रूप में पार्स किया जा सकता है 5। एएसटी एक्सप्लोरर द्वारा उत्पन्न अभिव्यक्ति के लिए सार सिंटेक्स ट्री नीचे दिया गया है:

एएसटी एक्सप्लोरर द्वारा उत्पन्न पार्स ट्री

यह (अप्रत्याशित तरीके से) मान्य जावास्क्रिप्ट है और इसका मूल्यांकन करता है -5


[१] संख्यात्मक अंकों के लिए व्याकरण के अनुसार दशमलव अंक और घातांक भाग वैकल्पिक हैं:

न्यूमेरिक लाईटल ::
  दशमूलारिष्ट
  […]

DecimalLiteral ::
  DecimalIntegerLiteral। DecimalDigits ऑप्ट एक्सपोनेंटपार्ट ऑप्ट चुनते हैं


आपने एएसटी कैसे निकाला?
10

8
Astexplorer.net पर जाएं , एक भाषा और एक पार्सर चुनें, कोड पेस्ट करें, JSON आउटपुट चुनें (या बस एक स्क्रीनशॉट लें)।
सलमान एक

39

जेएस में आप वैकल्पिक दशमलव बिंदु के साथ एक संख्या व्यक्त कर सकते हैं।

x = 5.;    //5
x = 5. + 6.   //11

और Tvde1 की टिप्पणी के अनुसार, किसी भी संख्या पद्धति को भी लागू किया जा सकता है।

5..toString()

यह सिंटैक्स हमें संख्याओं को बिना कोष्ठक के चलाने देता है।

5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome

यह जानने के लिए यह प्रश्न देखें कि क्यों।


4
तुम भी कर सकते हैं 5..toString()
Tvde1

2
यदि वास्तव में, आपको विधि को कॉल करने के लिए 5..toString () करना होगा, अन्यथा, आपको कोष्ठक (5) .toString ()
jo_va

3
@PeterMortensen रूबी, एक के लिए। इसके अलावा ALGOL 68. आम लिस्प में, अजीब तरह से पर्याप्त है, 1.0फ्लोटिंग पॉइंट है लेकिन 1.एक पूर्णांक है।
स्नेफेल

2
@FlorianF आप नहीं करेंगे, लेकिन इसका मतलब यह नहीं है कि पार्सर को इसे अस्वीकार करने के लिए विशेष-आवरण होना चाहिए। floatएस के तरीके हैं, और 5.एक है float
चेपनेर

2
@MasonWheeler यह निश्चित रूप से ऐसा नहीं है कि कोई अन्य भाषा जहां (1).toMethod()कानूनी रूप (1.)से सही तरीके से पार्स करने से प्रतिबंधित हो। पार्सिंग (टोकन के लालची लेक्सिंग, शाब्दिक, फिर पार्सिंग) के लिए सबसे पारंपरिक दृष्टिकोण जावास्क्रिप्ट व्यवहार का उत्पादन करता है।
स्नेफेल

7

मुझे लगता है कि असली जवाब दशमलव बिंदु के बारे में नहीं है, लेकिन माइनस साइन के बारे में है: क्या यह एक ऑपरेटर के रूप में व्याख्या करने वाला नहीं है अगर यह किसी भी चीज से पहले है जो एक नंबर की तरह दिखता है?


1
फिर, देखने के कुछ बिंदु में कम से कम, यह अभी भी है दशमलव बिंदु एक नंबर शाब्दिक के हिस्से के रूप में व्याख्या की जा रही के बारे में, नहीं तो क्या ऋण चिह्न नहीं होगा "एक नंबर की तरह दिखता है" पहले।
Pac0

5

console.log(0. - 5)      // -5
console.log(0 - 5)       // -5
console.log('0.' - 5)    // -5
console.log('0' - 5)     // -5
console.log(0.-5 === -5) // true

'0.' या '0' जावास्क्रिप्ट में समान है क्योंकि संख्या के लिए प्रकार अद्वितीय है, जिसे संख्या कहा जाता है। माइनस ऑपरेटर संख्याओं के बीच होता है, हमेशा कोशिश करें कि आप एक नंबर पर क्या करें। पायथन में अलग है पहला एक फ्लोट है और दूसरा एक इंटेगर है क्योंकि इसके कई प्रकार हैं।


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