"Var FOO = FOO কি করে || Avas} "(সেই ভেরিয়েবলের জন্য একটি ভেরিয়েবল বা একটি ফাঁকা বস্তু নির্ধারণ করুন) জাভাস্ক্রিপ্টে বোঝায়?


99

একটি অনলাইন উত্স কোডের দিকে তাকিয়ে আমি বেশ কয়েকটি উত্স ফাইলের শীর্ষে এসে পৌঁছেছি।

var FOO = FOO || {};
FOO.Bar = …;

তবে আমি কী জানি || {}না।

আমি জানি {}যে এর সমান new Object()এবং আমি মনে করি এটি ||"এর মতো কোনও কিছুর জন্য" যদি এটি ইতিমধ্যে বিদ্যমান থাকে তবে এর মানটি ব্যবহার করুন অন্যথায় নতুন বস্তুটি ব্যবহার করুন।

আমি কেন এটি উত্স ফাইলের শীর্ষে দেখব?


নোট: প্রশ্নটি জাভাস্ক্রিপ্ট উত্স ফাইলগুলির শীর্ষে সাধারণত দেখা যায় এমন একটি কোড প্যাটার্নটি প্রতিফলিত করতে সম্পাদিত হয়েছিল।
রবার্ট হার্ভে

উত্তর:


152

অভিপ্রায় হিসাবে আপনার অনুমান || {}বেশ কাছাকাছি।

এই নির্দিষ্ট প্যাটার্নটি যখন ফাইলগুলির শীর্ষে দেখা যায় একটি নেমস্পেস তৈরি করতে ব্যবহৃত হয় , অর্থাত্ একটি নামকৃত অবজেক্ট যার অধীনে গ্লোবাল অবজেক্টকে অযৌক্তিকভাবে দূষিত না করে ফাংশন এবং ভেরিয়েবল তৈরি করা যায়।

কারণ কেন এটি ব্যবহৃত হয় তাই হয় যে আপনি যদি দুটি (বেশী বা) ফাইল আছে:

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func1 = {
}

এবং

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func2 = {
}

উভয়ই ভাগ একই নামস্থান তাহলে যা কোন ব্যাপার না অর্ডার দুটি ফাইলের লোড, আপনি কি এখনও পেতে হয় func1এবং func2সঠিকভাবে মধ্যে সংজ্ঞায়িত MY_NAMESPACEবস্তুর সঠিকভাবে।

লোড হওয়া প্রথম ফাইলটি প্রাথমিক অবজেক্ট তৈরি করবে MY_NAMESPACEএবং পরবর্তী সময়ে লোড হওয়া ফাইলটি বস্তুটিকে বাড়িয়ে তুলবে ।

থেকে কার্যকররূপে, এটি পারবেন অ্যাসিঙ্ক্রোনাস স্ক্রিপ্ট ভাগ একই নামস্থান যা পৃষ্ঠা লোড বার উন্নত করতে পারেন লোড। যদি <script>ট্যাগগুলিতে deferঅ্যাট্রিবিউট সেট থাকে তবে আপনি জানতে পারবেন না যে কোন ক্রমে সেগুলি ব্যাখ্যা করা হবে, সুতরাং উপরে বর্ণিত হিসাবে এটিও সমস্যার সমাধান করে।


4
ঠিক এটি ক্ষেত্রে, শুরুতে ঠিক একই ঘোষণার সাথে বেশ কয়েকটি জেএস ফাইল রয়েছে, অনেক অনেক ধন্যবাদ!
রিকার্ডো সানচেজ

41
লাইনের মধ্যে পড়া এবং এটি করার কারণগুলি ব্যাখ্যা করার জন্য +1। যখন ব্যবহারকারী উত্তর চেয়েছিলেন কেবল তার পরিবর্তে ব্যবহারকারী আসলে চেয়েছিল এমন উত্তর দেয় তখন এটি সর্বদা ভাল । :)
স্পডলি

4
আমি এটি জাভাস্ক্রিপ্টের জন্য # ইফেনডেফ / # সংজ্ঞায়িত করতে বলতে চাই :)
ড্যারেন কোপ

4
||আপনি যখন function foo(arg1, optarg1, optarg2) { optarg1 = optarg1 || 'default value 1'; optarg2 = optart2 || 'defalt value 2';}
alচ্ছিক

4
@ crazy2be তাহলে ডিফল্ট truthy, কিন্তু falsey মান যেহেতু, আইনী রয়েছে এতে কাজ না হলে ||অপারেটর বলতে পারে না undefinedথেকে falsey
আলনিটাক

22
var AEROTWIST = AEROTWIST || {};

মূলত এই লাইনটি বলছে AEROTWISTভেরিয়েবলের মানের সাথে AEROTWISTভেরিয়েবল সেট করুন, বা এটি একটি খালি বস্তুতে সেট করুন।

ডাবল পাইপ ||একটি ওআর বিবৃতি, এবং ওআর এর দ্বিতীয় অংশটি কেবল তখনই কার্যকর করা হয় যদি প্রথম অংশটি মিথ্যা প্রত্যাবর্তন করে।

অতএব, যদি AEROTWISTইতিমধ্যে একটি মান থাকে তবে এটি সেই মান হিসাবে রাখা হবে তবে এটি যদি আগে সেট না করা থাকে তবে এটি একটি খালি বস্তু হিসাবে সেট করা হবে।

এটি মূলত এটি বলার মতই:

if(!AEROTWIST) {var AEROTWIST={};}

আশা করি এইটি কাজ করবে.


4
আসলে সুযোগটি আপনার শেষ উদাহরণে ঠিক থাকবে কারণ জেএসের ব্লক করার সুযোগ নেই
অলਨੀটক

@ অ্যালনিটাক - মেহ, আপনি ঠিক বলেছেন; আমি খুব ইদানীং বন্ধ হয়ে কাজ করছি এবং আমি বেসিকগুলি ভুলে গেছি। আমি উত্তরটি সম্পাদনা করব।
স্পুডলি

7

দুটি প্রধান অংশ রয়েছে যা var FOO = FOO || {};কভার করে।

# 1 ওভাররাইডগুলি রোধ করা হচ্ছে

আপনার কোডটি একাধিক ফাইলে বিভক্ত হয়ে গেছে এবং আপনার সহকর্মীরাও ডাকা একটি অবজেক্টে কাজ করছেন তা কল্পনা করুন FOO। তারপরে এটি কেসটি নিয়ে যেতে পারে যে কেউ এরই FOOমধ্যে এটির কার্যকারিতা সংজ্ঞায়িত এবং নির্ধারিত করেছে (কোনও skateboardফাংশনের মতো )। তারপরে আপনি এটিকে ওভাররাইড করতে পারেন, যদি আপনি এটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা না করে থাকেন।

সমস্যাযুক্ত কেস:

// Definition of co-worker "Bart" in "bart.js"
var FOO = {};

FOO.skateboard = function() {
  alert('I like skateboarding!');
};

// Definition of co-worker "Homer" in "homer.js"
var FOO = {};

FOO.donut = function() {
  alert('I like donuts!');
};

এই ক্ষেত্রে skateboardফাংশন আপনি জাভাস্ক্রিপ্ট ফাইল লোড সর্বস্বান্ত করা হবে homer.jsপরে bart.jsআপনার HTML কারণ হোমার একটি নতুন সংজ্ঞায়িত FOOবস্তু (এবং এইভাবে বার্ট থেকে বিদ্যমান এক ওভাররাইড করে) যাতে এটি শুধুমাত্র বিষয়ে জানেন donutফাংশন।

সুতরাং আপনার ব্যবহার করা দরকার var FOO = FOO || {};যার অর্থ "FOO এফইউকে দেওয়া হবে (এটি ইতিমধ্যে উপস্থিত থাকলে) বা একটি নতুন ফাঁকা বস্তু (যদি এফইও ইতিমধ্যে বিদ্যমান না থাকে)"।

সমাধান:

var FOO = FOO || {};

// Definition of co-worker Bart in bart.js
FOO.skateboard = function() {
  alert('I like skateboarding!');
};

// Definition of co-worker Homer in homer.js
var FOO = FOO || {};

FOO.donut = function() {
  alert('I like donuts!');
};

কারণ বার্ট এবং হোমার FOOতাদের পদ্ধতিগুলি সংজ্ঞায়নের আগে এখন অস্তিত্বের জন্য যাচাই করছেন , আপনি একে অপরের পদ্ধতিগুলিকে ওভাররাইড না করে লোড করতে bart.jsএবং homer.jsযে কোনও ক্রমে (যদি তাদের আলাদা নাম থাকে)। সুতরাং আপনি সর্বদা একটি FOOঅবজেক্ট পাবেন যার পদ্ধতি রয়েছে skateboardএবং donut(হ্যাঁ!)।

# 2 একটি নতুন অবজেক্টের সংজ্ঞা দেওয়া হচ্ছে

যদি আপনি প্রথম উদাহরণটি পড়ে থাকেন তবে আপনি ইতিমধ্যে এখন এর উদ্দেশ্য কী || {}

কারণ যদি কোনও বিদ্যমান FOOঅবজেক্ট না থাকে তবে ওআর-কেস সক্রিয় হয়ে যায় এবং একটি নতুন অবজেক্ট তৈরি করে, যাতে আপনি এটিতে ফাংশন নির্ধারণ করতে পারেন। পছন্দ:

var FOO = {};

FOO.skateboard = function() {
  alert('I like skateboarding!');
};

6

|| এর জন্য আর একটি সাধারণ ব্যবহার অপরিজ্ঞাত ফাংশন প্যারামিটারের জন্য একটি ডিফল্ট মান সেট করতে হয়:

function display(a) {
  a = a || 'default'; // here we set the default value of a to be 'default'
  console.log(a);
}

// we call display without providing a parameter
display(); // this will log 'default'
display('test'); // this will log 'test' to the console

অন্যান্য প্রোগ্রামিংয়ের সমতুল্য হ'ল:

function display(a = 'default') {
  // ...
}

আপনার varসামনে দরকার নেই a, aএকটি আনুষ্ঠানিক প্যারামিটার হিসাবে ফাংশনটির সম্পাদন প্রসঙ্গে প্রবেশ করে , তাই এটি ইতিমধ্যে ঘোষণা করা হয়েছে।
ফ্যাব্রেসিও মাট্টি

3

যদি এরিটওয়াইস্টে কোনও মান না থাকে বা এটি শূন্য বা সংজ্ঞায়িত করা হয় তবে নতুন এয়ারটওয়াইস্টে নির্ধারিত মানটি will} (একটি ফাঁকা বস্তু) হবে


1

||অপারেটর দুটি মানের লাগে:

a || b

যদি সত্যবাদী হয় তবে তা ফিরে আসবে a। অন্যথায়, এটি ফিরে আসবে b

Falsy মান null, undefined, 0, "", NaNএবং false। সত্যবাদী মূল্যবোধগুলি সমস্ত কিছু।

সুতরাং যদি aসেট না করা হয় (এটি undefined) এটি ফিরে আসবে b


আমি নিশ্চিত নই যে সত্যবাদী এবং মিথ্যাটিকে প্রকৃত শব্দ হিসাবে স্থির করা উচিত। মজাদার, তবে ঠিক স্ট্যান্ডার্ড নয়। :-)
অরব্লিং

4
@ আরব্লিংয়ের মাধ্যমে তারা জেএসে এই জাতীয় মান সম্পর্কে কথা বলতে বেশ ব্যবহৃত হয়।
আলনিটাক

অপারেটরটিকে সঠিকভাবে বর্ণনা করার জন্য +1, যেহেতু এটি লজিকাল অপারেটর নয়। কখনও কখনও এটিকে "ডিফল্ট অপারেটর" বলা হয়।
টিম বাথ

@ টিম ||জেএস (এবং পার্ল) এবং সি, সি ++ এবং জাভা সংস্করণের মধ্যে একমাত্র পার্থক্য হ'ল জেএস ফলাফলটি বুলিয়ানটিতে ফেলে না। এটি এখনও একটি লজিকাল অপারেটর।
আলনিটাক

@ অ্যালনিটক: অতীতে জেএস বিকাশকারীদের অ পেশাদার পেশাদার ব্যাকগ্রাউন্ডের কারণে সম্ভবত।
14-0 এ অরব্লিং

-1

লক্ষ্য করুন যে আইই এর কয়েকটি সংস্করণে এই কোডটি প্রত্যাশার মতো কাজ করবে না। কারণ var, ভেরিয়েবলটি নতুনভাবে সংজ্ঞায়িত করা হয়েছে এবং তাই নির্ধারিত হয়েছে - যদি আমি সমস্যাটি সঠিকভাবে স্মরণ করি - আপনি সর্বদা একটি নতুন অবজেক্টে পৌঁছে যাবেন। এটি সমস্যার সমাধান করা উচিত:

var AEROTWIST;
AEROTWIST = AEROTWIST || {};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.