javascript (' - जावास्क्रिप्ट स्ट्रिंग कैसे ऑब्जेक्ट नहीं है?




eval atob (2)

यह एक मजाक के लिए सेटअप नहीं है, मैं वास्तव में पूछ रहा हूँ।

डगलस क्रॉकफ़ोर्ड यह कहने का शौक है कि जावास्क्रिप्ट प्रोटोटाइप ऑब्जेक्ट उन्मुख भाषा में new आवश्यकता नहीं है।

वह बताते हैं कि लोगों को कक्षा-आधारित (यानी " शास्त्रीय ") ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषाओं से आने वाले लोगों को आराम के कुछ स्तर देने के लिए जोड़ा गया था:

जावास्क्रिप्ट, हम शायद ही कभी new हां

जावास्क्रिप्ट एक प्रोटोटाइप भाषा है, लेकिन इसमें एक new ऑपरेटर है जो इसे शास्त्रीय भाषा की तरह दिखने की कोशिश करता है। यह प्रोग्रामर को भ्रमित करता है, जिससे कुछ समस्याग्रस्त प्रोग्रामिंग पैटर्न होते हैं।

आपको जावास्क्रिप्ट में new Object() का उपयोग करने की आवश्यकता नहीं है। इसके बजाए ऑब्जेक्ट शाब्दिक {} प्रयोग करें।

अच्छा ठीक है:

  • new बुरा
  • {} अच्छा

लेकिन फिर टिप्पणीकार विटोर डी अरउजो ने बताया कि दोनों एक जैसे नहीं हैं । वह एक उदाहरण देता है जो दिखाता है कि एक string किसी object तरह नहीं है:

एक स्ट्रिंग ऑब्जेक्ट और स्ट्रिंग मान एक ही चीज़ नहीं हैं:

js> p = "Foo"
Foo
js> p.weight = 42
42
js> p.weight // Returns undefined

js> q = new String("Foo")
Foo
js> q.weight = 42
42
js> q.weight
42

स्ट्रिंग मान में नई गुण नहीं हो सकती है। वही बात अन्य प्रकार के लिए मान्य है।

यहां क्या हो रहा है कि एक string एक object नहीं object ? क्या मैं कुछ अन्य भाषाओं के साथ जावास्क्रिप्ट को भ्रमित कर रहा हूं, जहां सब कुछ एक वस्तु है?


Answers

"सब कुछ एक वस्तु है" ... यह भाषा के चारों ओर मौजूद बड़ी गलत धारणाओं में से एक है।

सब कुछ एक वस्तु नहीं है, हम वही हैं जो हम आदिम मूल्य कहते हैं , जो स्ट्रिंग, संख्या, बुलियन, शून्य, और अपरिभाषित हैं।

यह सच है, एक स्ट्रिंग एक आदिम मान है , लेकिन आप String.prototype से विरासत में प्राप्त सभी विधियों तक पहुंच सकते हैं जैसे कि यह एक ऑब्जेक्ट था।

संपत्ति एक्सेसर ऑपरेटरों (डॉट और ब्रैकेट नोटेशन), अस्थायी रूप से उन विधियों तक पहुंचने में सक्षम होने के लिए स्ट्रिंग मान को स्ट्रिंग ऑब्जेक्ट में परिवर्तित करते हैं, उदाहरण के लिए:

"ab".charAt(1); // "b"

दृश्यों के पीछे क्या होता है इस तरह कुछ है:

new String("ab").charAt(1); // "b", temporal conversion ToObject

जैसा कि अन्य आदिम मूल्यों जैसे कि Boolean और Number , ऑब्जेक्ट रैपर हैं , जो केवल वे वस्तुएं हैं जिनमें आदिम मूल्य होता है, जैसा कि आपके उदाहरण में है:

var strObj = new String("");
strObj.prop = "foo";

typeof strObj; // "object"
typeof strObj.prop; // "string"

एक आदिम के साथ:

var strValue = "";
strValue.prop = "foo";

typeof strValue; // "string"
typeof strValue.prop; // "undefined"

और ऐसा इसलिए होता है क्योंकि दोबारा, दूसरी पंक्ति पर संपत्ति एक्सेसर, एक नई अस्थायी वस्तु बनाता है, जैसा कि:

var strValue = "";
new String(strValue).prop = "foo"; // a new object which is discarded
//...

चेतावनी: यह उत्तर केवल एक संभावित समाधान के रूप में प्रदान किया गया है; यह स्पष्ट रूप से सबसे अच्छा समाधान नहीं है, क्योंकि इसमें jQuery की आवश्यकता होती है। इसके बजाय, शुद्ध जावास्क्रिप्ट समाधान पसंद करते हैं।

$(location).attr('href', 'http://.com')






javascript