चलो थोड़ा और खेलते हैं!
पहले, चलो कुछ मजा करें! "
//----------#01#-----------
{}[true]; //[true]
//----------#02#-----------
var a = {}[true];
console.log(a); //undefined
//----------#03#-----------
{ b: 12345 }[true]; //[true]
//----------#04#-----------
{ b: 12345 }["b"]; //evaluates to ["b"] ?!?
//----------#05#-----------
{ b: 12345 }.b; // "Unexpected token ."
//----------#06#-----------
({ b: 12345 }).b; //12345
//----------#07#-----------
var c = { b: 12345 }.b;
console.log(c); //12345
//----------#08#-----------
var c = { b: 12345 }["b"];
console.log(c); //12345
//----------#09#-----------
{ true: 54321 }[true]; // "SyntaxError: Unexpected token : "
//----------#10#-----------
var d = { true: 54321 }[true]; //No error here ¬¬
console.log(d); //54321
//----------#11#-----------
!{}[true]; // true
ठीक है, आइए एक-एक करके इन पागल व्यवहारों को समझने की कोशिश करें:
1) यहाँ, {}एक खाली कोड ब्लॉक के रूप में पार्स किया गया है। बिना असाइनमेंट, नेगशन, ग्रुपिंग (कोष्ठकों के साथ) या किसी भी वाक्य रचना जो पार्सर को इंगित करता है कि यह {}एक वस्तु शाब्दिक है, डिफ़ॉल्ट धारणा यह सोचना है कि यह केवल एक बेकार खाली ब्लॉक है।
यह इस व्यवहार का प्रमाण है:
{ alert(123) }[true]
ऊपर दिया गया कोड सामान्य रूप से अलर्ट दिखाएगा, और मूल्यांकन किया जाएगा [true], उसी तरह से {}[true]है।
अर्धविराम के बिना ब्लॉक विवरण
एक ब्लॉक-प्रकार के बयान के बाद अर्धविराम की आवश्यकता नहीं होती है।
उदाहरण के लिए:
for(var i=0; i < 1; i++){}function a(){};alert("Passed here!");if(true){}alert("Passed here too!")
दोनों अलर्ट दिखाए गए हैं।
इसलिए, हम देख सकते हैं कि अर्धविराम के बिना एक खाली ब्लॉक स्टेटमेंट वैध है और बस कुछ नहीं करता है। इस तरह, जब आप {}[true]डेवलपर टूल (या फायरबग) कंसोल में प्रवेश करते हैं, तो मूल्यांकन किया गया मूल्य अंतिम अभिव्यक्ति कथन का मूल्य होगा । इस मामले में, अंतिम अभिव्यक्ति कथन है [true]।
2) असाइनमेंट के संदर्भ में, पार्सर यह सुनिश्चित करेगा कि {}एक वस्तु शाब्दिक है। जब आप var a = करते हैं {}[true], तो आप किसी भी अस्पष्टता को दूर करते हैं और पार्सर को टिप देते हैं जो कि {}ब्लॉक स्टेटमेंट नहीं है।
तो, यहाँ, आप "true"एक खाली वस्तु से एक कुंजी के साथ एक मूल्य प्राप्त करने की कोशिश कर रहे हैं । जाहिर है, इस कुंजी नाम के साथ कोई कुंजी-मूल्य जोड़ी नहीं है। इस तरह, एक चर अपरिभाषित है।
ऑब्जेक्ट कुंजी के रूप में आरक्षित शब्द
ECMAScript 5 ऑब्जेक्ट कुंजियों को आरक्षित शब्द बनाने की अनुमति देता है। तो, निम्नलिखित कुंजियाँ कानूनी हैं:
var obj = {if: 111, for: 222, switch: 333, function: 444, true: 555}
3) उदाहरण 1 का एक ही स्पष्टीकरण । लेकिन ... यदि { b: 12345 }भाग को ब्लॉक स्टेटमेंट माना जाता है, तो स्टेटमेंट का प्रकार क्या है b: 12345??
... (?????)
यह एक लेबल स्टेटमेंट है , आप इसे पहले ही देख चुके हैं ... इसका उपयोग लूप और इन में किया जाता है switch। यहां लेबल स्टेटमेंट के बारे में कुछ दिलचस्प लिंक दिए गए हैं: 1 , (2) [ जावास्क्रिप्ट में नेस्टेड लूप्स से तोड़ने का सबसे अच्छा तरीका है? , (3) [ जावास्क्रिप्ट में नेस्टेड छोरों को कैसे तोड़ें? ।
नोट: बस इसका मूल्यांकन करने का प्रयास करें:
{a: 1, b: 2} //=>>>SyntaxError: Unexpected token :
लेबल के बयान अल्पविराम ऑपरेटर द्वारा अलग नहीं किए जा सकते हैं , आपको उन्हें अर्धविराम के साथ अलग करना होगा। तो यह मान्य है:{a: 1; b: 2}
4) उदाहरण 1 और 3 के स्पष्टीकरण देखें ...
5) एक बार, हमारे पास एक { b: 12345 }कोड ब्लॉक के रूप में माना जा रहा है, और आप डॉट नोटेशन का उपयोग करके कोड ब्लॉक की एक संपत्ति तक पहुंचने की कोशिश कर रहे हैं , और जाहिर है, यह अनुमति नहीं है, और पार्सर एक "Unexpected token :"अपवाद फेंकता है।
6) कोड उपरोक्त उदाहरण के लगभग समान है, लेकिन अभिव्यक्ति समूहीकरण ऑपरेटर के{ b: 12345 } साथ बयान के आसपास से , पार्सर को पता चल जाएगा कि एक वस्तु है। इस तरह, आप संपत्ति को सामान्य रूप से एक्सेस कर पाएंगे ।"b"
7) उदाहरण 2 को याद रखें , हमारे यहां एक असाइनमेंट है, पार्सर जानता है कि { b: 12345 }एक वस्तु है।
8) उपरोक्त उदाहरण की पहचान, लेकिन डॉट नोटेशन के बजाय, यहाँ हम ब्रैकेट नोटेशन का उपयोग कर रहे हैं ।
9) मैंने पहले ही कहा था कि "identifier: value"एक ब्लॉक स्टेटमेंट के अंदर यह सिंटैक्स एक लेबल है। लेकिन, आपको यह भी जानना होगा कि एक लेबल नाम आरक्षित कीवर्ड (ऑब्जेक्ट प्रॉपर्टी के नाम के विपरीत) नहीं हो सकता है। जब हमने एक लेबल को परिभाषित करने का प्रयास किया "true", तो हमें एक मिला SyntaxError।
10) फिर, हम एक वस्तु के साथ काम कर रहे हैं। यहां आरक्षित शब्दों का उपयोग करने में कोई समस्या नहीं है। =)
11) अंत में, हमारे पास यह है:!{}[true]
आइए यहां चीजों को अलग करें:
एक) एक निषेध करने से, हम पार्सर को बताए रहे हैं कि {}है एक वस्तु ।
b) जैसा कि उदाहरण 2 में दिखाया गया है , एक {}वस्तु में एक संपत्ति नहीं है जिसे कहा जाता है true, इसलिए यह अभिव्यक्ति का मूल्यांकन करेगा undefined।
ग) अंतिम परिणाम undefinedमूल्य की उपेक्षा है । Javascript इम्प्लिसिटी टाइप undefinedकन्वर्सेशन करता है , और वैल्यू मिथ्या है ।
d) तो, की उपेक्षा falseहै ... true!
var o = {}; o[true] === undefined।