फेंक त्रुटि ('संदेश') बनाम नई त्रुटि फेंक ('संदेश')


165
var err1 = Error('message');
var err2 = new Error('message');

क्या फर्क पड़ता है? क्रोम कंसोल में उन्हें देखते हुए, वे समान दिखते हैं। वस्तु और समान __proto__श्रृंखला पर समान गुण । लगभग Errorएक कारखाने की तरह काम करता है।

कौन सा सही है और क्यों?


5
सभी मूल निर्माणकर्ता ईसीएमएस्क्रिप्ट में परिभाषित किए गए हैं, जिसमें उनके संबंधित व्यवहार को शामिल किया गया है जब बिना बुलाए गए new
हेट लज़ीज़

जवाबों:


164

दोनों ठीक हैं; यह स्पष्ट रूप से विनिर्देश में कहा गया है :

... इस प्रकार फ़ंक्शन कॉल समान तर्कों के साथ Error(…)ऑब्जेक्ट निर्माण अभिव्यक्ति के बराबर है new Error(…)


7
क्या ES6 में भी यह सच है?
पौल्मेलनिको

4
हाँ। वर्तमान डॉक्स के लिए देखें: ecma-international.org/ecma-262/6.0/…
TheUtherSide

@paulmelnikow - हाँ। पिछड़ी संगतता TC39 की सर्वोच्च प्राथमिकता है। मंत्र है "वेब को मत तोड़ो।"
टीजे क्राउडर

17

Errorएक कारखाने की तरह काम करता है, कुछ अन्य देशी कंस्ट्रक्टर्स की तरह: Array, Object, आदि जैसे सभी चेक कुछ if (!(this instanceof Array)) { return new Array(arguments); }। (लेकिन ध्यान दें कि String(x)और new String(x)बहुत अलग हैं, और इसी तरह के लिए Numberऔर Boolean।)

कहा कि, एक त्रुटि के मामले में, एक Errorवस्तु को फेंकना भी आवश्यक नहीं है ... throw 'Bad things happened';काम करेगा,
आप डिबगिंग के लिए एक वस्तु शाब्दिक भी फेंक सकते हैं:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};

9
मुझे डर है कि मैं पूरी तरह से सहमत नहीं हूं। String("abc")एक Stringवस्तु नहीं बनाता है , जबकि new String("abc")करता है।
pimvdb

2
@pimvdb: सच है, मैं यह करने के लिए बदल दिया है Object=> Object('foo')रिटर्न एक स्ट्रिंग वस्तु ... इसके बारे में बात करने के लिए आते लगभग सभी देशी कंस्ट्रक्टर्स है एक सा गलत ... Number, Boolean, Date, Stringसभी ऐसा नहीं ... Array, Objectऔर Errorकरते हैं, लेकिन Eventऔर सभी- DOMxxxxवापी निर्माणकर्ताओं ने त्रुटियां फेंक दीं
एलियास वान ओओटगेम

मुझे भी लगता new Array(arguments)है कि वास्तव में जो Array(1, 2, 3)करता है वह नहीं करता है। लेकिन शायद मैं सिर्फ
नाइटपिटिंग

8
तार फेंकने के संबंध में पूरक: एक स्ट्रिंग एक त्रुटि नहीं है
एलेक्स

11
@alex: दी गई, गैर- Errorइंस्टेंसेस (या स्ट्रिंग शाब्दिक) को फेंकने से स्टैक-ट्रेस खो जाता है। लिंक किए गए लेख पर केवल एक नाइट-पिक: arguments.calleeसख्त मोड में निषिद्ध है
एलियास वान ओओटगेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.