জাভাস্ক্রিপ্টে রুবির || = (বা সমান)?


128

আমি রুবির ||=প্রক্রিয়া পছন্দ করি love যদি কোনও ভেরিয়েবলের অস্তিত্ব থাকে না বা থাকে nil, তবে এটি তৈরি করুন এবং এটি কোনও কিছুর সমান সেট করুন:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

আমার এখন জাভাস্ক্রিপ্টে অনুরূপ কিছু করা দরকার। এটি করার কনভেনশন বা সঠিক উপায় কী? আমি জানি ||=বৈধ সিনট্যাক্স নয়। এটি পরিচালনা করার জন্য 2 সুস্পষ্ট উপায় হ'ল:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};

উত্তর:


152

উভয়ই একেবারে সঠিক, তবে আপনি যদি এমন কোনও কিছু খুঁজছেন যা রুবীর মতো কাজ করে ||=। প্রথম পদ্ধতিটি যা variable = variable || {}আপনি সন্ধান করছেন তা হ'ল :)


1
xএটির জন্য কোনও বৈধ মানটি মিথ্যা, পছন্দ মতো ব্যবহারের ক্ষেত্রে যত্নশীল falseএবং আপনি কেবল অপরিজ্ঞায়িত হলেই কোনও ডিফল্ট সেট করতে চান x
জোশুয়া পিন্টার

উপরের মন্তব্য সঠিক। আপনার উদাহরণস্বরূপ কেস নেওয়া, এটি জেএসে একইভাবে কাজ করবে না। let amount = 0;এর পরে amount = amount || 5 পরিমাণ 5 এ পরিবর্তিত হবে you আপনি যদি না চান তবে ??পরিবর্তে অপারেটরটি ব্যবহার করুন ||
আশ্বিনকুমারস

@ আশ্বিনকুমারস বা কেবল ব্যবহার করুন amount ??= 5;
ব্যবহারকারী 4642212

22

আপনি লজিক্যাল ওআর অপারেটরটি ব্যবহার করতে পারেন ||যা lValমিথ্যা মান হলে এর ডান অপরেন্ডকে মূল্যায়ন করে।

মিথ্যা মানগুলির মধ্যে উদাহরণস্বরূপ অন্তর্ভুক্ত null, false, 0, "", undefined, NaN

x = x || 1

xএটির জন্য কোনও বৈধ মানটি মিথ্যা, পছন্দ মতো ব্যবহারের ক্ষেত্রে যত্নশীল falseএবং আপনি কেবল অপরিজ্ঞায়িত হলেই কোনও ডিফল্ট সেট করতে চান x
জোশুয়া পিন্টার

4

আপনি যদি অবজেক্টের সাথে কাজ করছেন, আপনি এভাবে (যেমন ES6) ডেস্ট্রাকচারিং ব্যবহার করতে পারেন:

({ myLib: window.myLib = {} } = window);

... তবে আপনি বিভ্রান্তি বাদে গ্রহণযোগ্য উত্তরের চেয়ে কিছুই অর্জন করতে পারেন না।


1
"তবে আপনি বিভ্রান্তি ব্যতিরেকে গৃহীত উত্তরের চেয়ে কিছুই অর্জন করতে পারবেন না" - চমৎকার। :)
লিন্ডস

আমি বাজি
ধরছি

1

আপনি যে অপারেটরের বিষয়ে জিজ্ঞাসা করেছিলেন সেটিকে জাভাস্ক্রিপ্টে একটি বৈশিষ্ট্য হিসাবে প্রস্তাব করা হয়েছে । এটি বর্তমানে পর্যায় 3 এ রয়েছে , সুতরাং এটি এখনও ভাষার কোনও আনুষ্ঠানিক অংশ নয়, তবে তারা যদি বড় ধরনের অপ্রত্যাশিত সমস্যাগুলি আবিষ্কার করে তবে বেশিরভাগ ছোট্ট পরিবর্তন সহ এটি গ্রহণযোগ্য হবে।

আপনি এখন এটি প্লাগইন-প্রস্তাব-লজিক্যাল-অ্যাসাইনমেন্ট-অপারেটর বাবেল প্লাগইন ব্যবহার করে ব্যবহার করতে পারেন । আমি এই প্লাগইনটি কখনই ব্যবহার করি নি, সুতরাং এটি কতটা ভাল কাজ করে তা আমার কোনও ধারণা নেই।


-1

রুবির || = অপারেটর শর্ট সার্কিট অ্যাসাইনমেন্ট। এটি এরকমভাবে চিন্তা করা যেতে পারে:

return a || a = b

সুতরাং জাভাস্ক্রিপ্টে, এটি দেখতে খুব সাদৃশ্যপূর্ণ:

return a || (a = b);

এটি নীচের মন্তব্যে যেমন উল্লেখ করা হয়েছে তেমন মনে হয়, এই আক্ষরিক রুবি ফর্মটি স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট আইডিয়ামের তুলনায় কম দক্ষ a a = a || খ।

রেফারেন্সের জন্য: http://www.rubyinside.com/hat-rubys-double-pipe-or-equals-really-does-5488.html


1
অনুশীলনে এটি মনে হয় যে a = a || bফর্মটি আরও অনুকূল jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

আহ শীতল সরঞ্জাম। এক্স এর মান এবং এত সংক্ষিপ্ত সার্কিট থাকলে এটি দেখতে কেমন লাগে?
ক্রিস

আমি বিশ্বাস করি যে টিয়ারডাউনটি স্পষ্টভাবে জাসস্পারফের হওয়া দরকার তাই এই পরীক্ষায় শর্ট সার্কিটের পারফরম্যান্স দেখাতে হবে। আমার অনুমান যে ফর্মটির জন্য ভি 8 এর একটি বিশেষ অপ্টিমাইজেশন রয়েছে a = a || b
jchook

3
এফওয়াইআই দেখে মনে হচ্ছে যে কিছু পার্থক্য ছিল তা এখনই দূরে সরিয়ে নেওয়া হয়েছে।
চার্লস উড

a || (a = b)ফাংশন নামগুলি অনুমান করার সঠিক শব্দার্থবিজ্ঞান রয়েছে। এটি বর্তমানে নতুন প্রস্তাবের জন্য আলোচনায় রয়েছে
user4642212

-1

আপনি কেবল পূর্ণসংখ্যার জন্য জাভাস্ক্রিপ্টে | = অপারেটর ব্যবহার করে পছন্দসই আচরণ অর্জন করতে পারেন। তবে আপনাকে প্রথমে পরিবর্তনশীলটি সংজ্ঞায়িত করতে হবে।

let a = 0
a |= 100
console.log(a) // 100

বস্তুর জন্য

let o = {}
o.a |= 100
console.log(o) // {a: 100}

অ্যারে জন্য

let arr = []
arr[0] |= 100
console.log(arr) // [100]

প্রশ্নটি |বা সম্পর্কে নয় |=। প্রশ্নে কাঙ্ক্ষিত আচরণ বিটওয়াইজ অপারেশনের সাথে সম্পর্কিত নয়।
ব্যবহারকারী4642212

আপনি ঠিক বলেছেন আমি সেই অনুসারে উত্তরটি সম্পাদনা করব
প্রাচীরগীক

সম্পাদনা করা হয়েছে। আমি আশা করি এটি এখন সার্থক হয়ে উঠবে।
দেয়ালজেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.