এবার আরও কিছু খেলি!
প্রথমে কিছু মজা করা যাক!
//----------#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 এর ব্যাখ্যা দেখুন ...
৫) আরও একবার, আমাদের { b: 12345 }একটি কোড ব্লক হিসাবে ধরা হচ্ছে এবং আপনি ডট স্বরলিপি ব্যবহার করে একটি কোড ব্লকের কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করছেন , এবং স্পষ্টতই, এটি অনুমোদিত নয় এবং পার্সার একটি "Unexpected token :"ব্যতিক্রম ছুঁড়ে ফেলে ।
6) কোডটি উপরের উদাহরণের সাথে প্রায় অভিন্ন, তবে এক্সপ্রেশন গ্রুপিং অপারেটরের{ b: 12345 } সাথে বিবৃতিকে ঘিরে , পার্সারটি জানতে পারবে যে এটি একটি অবজেক্ট। এইভাবে, আপনি সম্পত্তিটি সাধারণত অ্যাক্সেস করতে সক্ষম হবেন ।"b"
)) উদাহরণটি মনে রাখবেন ২ , আমাদের এখানে একটি অ্যাসাইনমেন্ট রয়েছে, পার্সার জানে যে { b: 12345 }এটি একটি অবজেক্ট।
8) উপরের উদাহরণের মতো, তবে বিন্দু চিহ্নিতকরণের পরিবর্তে, আমরা এখানে বন্ধনী চিহ্নিতকরণ ব্যবহার করছি ।
9) আমি ইতিমধ্যে বলেছি যে "identifier: value"একটি ব্লক স্টেটমেন্টের ভিতরে এই সিনট্যাক্সটি একটি লেবেল। তবে, আপনাকে আরও জানতে হবে যে একটি লেবেল নাম কোনও সংরক্ষিত কীওয়ার্ড (বস্তুর সম্পত্তির নামের বিপরীতে) হতে পারে না। আমরা যখন নামক একটি লেবেল সংজ্ঞায়িত করার চেষ্টা করেছি তখন আমরা একটি "true"পেয়েছি SyntaxError।
10) আবার, আমরা একটি বিষয় নিয়ে কাজ করছি। এখানে সংরক্ষিত শব্দ ব্যবহার করে কোনও সমস্যা নেই। =)
11) অবশেষে, আমাদের এটি আছে:!{}[true]
আসুন এখানে জিনিস পৃথক:
ক) একটি অস্বীকৃতি করার মাধ্যমে আমরা পার্সার করার পরিচায়ক করছেন {}হয় একটি বস্তু ।
খ) উদাহরণ 2- এ প্রদর্শিত হিসাবে , কোনও {}বস্তুর কোনও সম্পত্তি বলা হয় না true, সুতরাং এই অভিব্যক্তিটি মূল্যায়ন করবে undefined।
গ) চূড়ান্ত ফলাফলটি undefinedমান অবহেলা । জাভাস্ক্রিপ্ট ইম্পিলিটি ধরণের রূপান্তর সম্পাদন করে এবং undefinedমানটি মিথ্যা ।
d) সুতরাং, অবহেলা falseহ'ল ... true!
var o = {}; o[true] === undefined।