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


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.