একটি "অন্যথায়" ছাড়া জাভাস্ক্রিপ্টে টার্নারি অপারেটরগুলি


149

আমাকে সবসময় nullঅন্য কিছু শর্ত রাখতে হয়েছিল যার কিছু নেই। এটি প্রায় কোন উপায় আছে কি? যেমন

condition ? x = true : null;

মূলত, এখানে করার উপায় আছে:

condition ? x = true;

এখন এটি একটি সিনট্যাক্স ত্রুটি হিসাবে দেখায়

এফওয়াইআই, এখানে কিছু বাস্তব উদাহরণ কোড রয়েছে:

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

21
যেমন একটি ত্রিনিয়ার ব্যবহার condition ? x = true : null;সম্ভবত হিসাবে লেখা উচিত x = (condition ? true : null);। একদিকে যেমন, জাভাস্ক্রিপ্টে nullমিথ্যা হিসাবে মূল্যায়ন করে তাই আপনি এই ক্ষেত্রে x = (condition);একই ফলাফল অর্জন করতে পারেন ।
ম্যাট এস

1
ম্যাট, আপনার উত্তরটি সেরা, তবে এটি কোনও উত্তর নয়, এটি একটি মন্তব্য!
চিজো

ম্যাট, আমার বাস্তব কোডটি হ'ল:! ডিফল্টস্লাইডশো উইথ? Defaults.slideshowWidth = obj.find ('img')। প্রস্থ () + 'px': নাল; একটি সংক্ষিপ্ত, যে ভাল উপায়?
অস্কার গডসন

2
Defaults.slideshowWidth = Defaults.slideshowWidth || obj.find ('img')। প্রস্থ () + 'px';
কেনেবেকে

পরিচয়ের কার্যভার এড়ানো ভাল হবে, সুতরাং এটি কেবল একটি শর্ত হওয়া উচিত:if (!defaults.slideshowWidth) defaults.slideshowWidth = obj.find('img').width()+'px'
মিহাইল মালোস্টানিডিস

উত্তর:


226

প্রথমত, একটি ত্রৈমাসিক অভিব্যক্তি কোনও / অন্য নির্মাণের জন্য প্রতিস্থাপন নয় - এটি যদি / অন্যটি নির্মাণ করে একটি মান দেয় তবে এটির সমতুল্য । এটি, যদি একটি / অন্য ধারাটি কোড হয়, একটি ত্রৈমাসিক অভিব্যক্তিটি একটি অভিব্যক্তি , যার অর্থ এটি একটি মান দেয়।

এর অর্থ কয়েকটি জিনিস:

  • =ফেরতের মান নির্ধারিত হওয়ার পরে বাম দিকে আপনার যখন ভেরিয়েবল থাকে কেবল তখনই টের্নারি এক্সপ্রেশন ব্যবহার করুন
  • প্রত্যাবর্তিত মান দুটি মানের মধ্যে একটি হতে হলে কেবল ত্রৈমাসিক এক্সপ্রেশন ব্যবহার করুন (বা যদি উপযুক্ত হয় তবে নেস্টেড এক্সপ্রেশন ব্যবহার করুন)
  • অভিব্যক্তির প্রতিটি অংশের (পরে? এবং পরে:) পার্শ্ব প্রতিক্রিয়া ছাড়াই একটি মান ফেরত দেওয়া উচিত ( x = trueসমস্ত এক্সপ্রেশনগুলি সর্বশেষ মানটি ফেরত দেওয়ার সাথে সাথে এক্সটিও পরিবর্তিত হয় তবে x পরিবর্তিত মানের উপর কোনও প্রভাব ফেলে না)

সংক্ষেপে - একটি ত্রৈমাসিক অভিব্যক্তিটির 'সঠিক' ব্যবহার

var resultofexpression = conditionasboolean ? truepart: falsepart;

আপনার উদাহরণের পরিবর্তে condition ? x=true : null ;, যেখানে আপনি মান নির্ধারণের জন্য একটি ত্রৈমাসিক ভাবটি ব্যবহার করেন x, আপনি এটি ব্যবহার করতে পারেন:

 condition && (x = true);

এটি এখনও একটি অভিব্যক্তি এবং অতএব বৈধতা পাস করতে পারে না, তাই আরও ভাল পদ্ধতির হতে পারে

 void(condition && x = true);

শেষটি বৈধতা পাস করবে।

তবে আবার, প্রত্যাশিত মানটি যদি বুলিয়ান হয় তবে শর্তটি প্রকাশের ফলাফলটি নিজেই ব্যবহার করুন

var x = (condition); // var x = (foo == "bar");

আপডেট আপনার নমুনা সম্পর্কিত এটি সম্ভবত আরও উপযুক্ত:

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

4
উজ্জ্বল এসও, সম্পাদনাটি i/elseটাইপো সংশোধন করার অনুমতি দেয় না কারণ এটি পর্যাপ্ত অক্ষর নয়।
শিশির

1
অকার্যকর (শর্ত && x = সত্য) - এটি দুর্দান্ত দেখায় তবে "অবৈধ অ্যাসাইনমেন্ট বাম-হাতের ত্রুটি" ছুঁড়ে
ফেলেছে

1
অকার্যকর (শর্ত && (x = সত্য)) // অ্যাসাইনমেন্টটিকে প্রথম মান থেকে আলাদা রাখে
ডায়মন্ডিয়া

4
তবে এটি পড়ার জন্য স্বজ্ঞাত নয়, বিশেষত বিকাশকারীদের পক্ষে এই শৈলীতে অভ্যস্ত নয়। আপনি যত সহজে এবং আরও সহজেই সহজে লিখতে পারতেন: যদি (শর্ত) {x = সত্য; }
ডায়মন্ডসিয়া

2
আপনি "বৈধতা পাস করতে পারবেন না" বলতে কী বোঝাতে চেয়েছিলেন? কেন বুঝতে হবে না কেন একজনের ভিতরে প্রকাশ করা উচিত void()। ধন্যবাদ।
গিলাদ মায়ানী

20

না, এর জন্য তিনটি অপরেন্দ্র দরকার। এ কারণেই তাদের বলা হয় টের্নারি অপারেটর।

তবে আপনার উদাহরণ হিসাবে যা আছে তার জন্য আপনি এটি করতে পারেন:

if(condition) x = true;

যদিও আপনার যদি ভবিষ্যতে একাধিক বক্তব্য যোগ করার প্রয়োজন হয় তবে ধনুর্বন্ধনী থাকা নিরাপদ:

if(condition) { x = true; }

সম্পাদনা: এখন আপনি যে আসল কোডটি উল্লেখ করেছেন তাতে আপনার প্রশ্নটি প্রযোজ্য:

if(!defaults.slideshowWidth)
    { defaults.slideshowWidth = obj.find('img').width()+'px'; }

1
আপনি পারেন, কিন্তু আপনার করা উচিত নয়। চারপাশে কোঁকড়ানো বন্ধনী ছাড়া কমপক্ষে - এটি খুব ত্রুটিযুক্ত।
কোনারাক

1
এটা কি সত্যি? আমি বুঝতে পারি যে কার্লিগুলির প্রয়োজনীয়তার মূল কারণ হ'ল তারা জ্লিন্টের জীবনকে সহজ করে তোলে।
চিজো

@ চেসো এটি রিফ্যাক্টরিং অর্থে ত্রুটিযুক্ত। আপনি কোনও কোঁকড়ানো ধনুর্বন্ধনী আছে তা বুঝতে না পেরে সত্যিকারের অবস্থার জন্য আরও যোগ করতে ফিরে আসুন। নতুন কোডটি সর্বদা কার্যকর হওয়ার চেয়ে কার্যকর হবে will
ম্যাট এস

আমি জানি না, আমি কেবল অতিরিক্ত ছাড়াই শর্তসাপেক্ষ লিখতে পছন্দ করি যেমন ()}} {{{} যখন এটির সমান হয়?::;
অস্কার গডসন

3
সত্যি বলতে, আমি কখনই জাভাস্ক্রিপ্টের চেয়ে বিকাশকারীদের কোনও ভাষা ব্যবহার করতে বেশি ভয় পেতাম না: - পিআই আমাকে এমন কেউ বলতে চাইবে না যে আমার কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করা উচিত নয়। আমি এগুলিকে অনেক বাদ দিয়েছি এবং ঘটনাক্রমে আমি একটি ধনুর্বন্ধনীটি মিস করার চেয়ে কখনও আর কোনও সমস্যায় পড়ি না।
অ্যান্ডি ই

12

বিবৃতি বাক্য গঠন সংক্ষিপ্ত করতে প্রায়শই লোকেরা লজিকাল অপারেটর ব্যবহার করে:

!defaults.slideshowWidth &&
  (defaults.slideshowWidth = obj.find('img').width()+'px');

তবে আপনার বিশেষ ক্ষেত্রে বাক্য গঠন আরও সহজ হতে পারে

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

defaults.slideshowWidthযদি defaults.slideshowWidthসত্য এবং obj.find('img').width()+'px'অন্যথায় মানকে মূল্যায়িত করা হয় তবে এই কোডটি মানটি ফিরিয়ে দেবে ।

দেখুন শর্ট সার্কিট মূল্যায়ন বিস্তারিত জানার জন্য লজিক্যাল অপারেটরের।


11
var x = condition || null;

2
(defaults.slideshowWidth) || (defaults.slideshowWidth = obj.find('img').width()+'px')বাdefaults.slideshowWidth = defaults.slideshowWidth || (obj.find('img').width()+'px')
ক্যাসি চু

> যদি এটি সত্যে রূপান্তর করা যায় তবে এক্সপ্রেস 1 প্রদান করে; অন্যথায়, expr2 প্রদান করে। লজিকাল অপারেটরগুলি (এমডিএন)
স্যাজাবলস পল করুন

5

আপনি লিখতে পারে

x = condition ? true : x;

সুতরাং শর্তটি মিথ্যা হলে সেই এক্সটি অপরিবর্তিত।

এটি তখন সমান

if (condition) x = true

সম্পাদনা করুন:

!defaults.slideshowWidth 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : null 

কয়েকটি বিকল্প রয়েছে - আমি বলছি না যে এগুলি আরও ভাল / খারাপ - নিছক বিকল্প

তৃতীয় প্যারামিটার হিসাবে নাল মধ্যে পাস করা কাজ করে কারণ বিদ্যমান মান নাল। আপনি যদি অশোধক এবং শর্তটি পরিবর্তন করেন তবে একটি বিপদ আছে যে এটি আর সত্য নয়। এর বিপরীতে টেরিনারি গার্ডদের মধ্যে দ্বিতীয় পছন্দ হিসাবে এক্সাইজিং মানকে উত্তীর্ণ করা:

!defaults.slideshowWidth = 
      ? defaults.slideshowWidth = obj.find('img').width()+'px' 
      : defaults.slideshowwidth 

নিরাপদ, তবে দেখতে ততটা সুন্দর নয় এবং আরও টাইপিং। অনুশীলনে, আমি সম্ভবত লিখতে চাই

defaults.slideshowWidth = defaults.slideshowWidth 
               || obj.find('img').width()+'px'

কিছু লাইভ কোড (যাইহোক যাইহোক এর নাল থেকে মুক্তি পেতে?):! ডিফল্টস্লাইডশো উইথ? Defaults.slideshowWidth = obj.find ('img')। প্রস্থ () + 'px': নাল;
অস্কার গডসন

2

আপনার ক্ষেত্রে আমি টার্নারি অপারেটরকে অপ্রয়োজনীয় হিসাবে দেখছি। আপনি ||, && অপারেটরগুলি ব্যবহার করে সরাসরি অভিব্যক্তিকে ভেরিয়েবল বরাদ্দ করতে পারেন।

!defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null ;

হয়ে যাবে :

defaults.slideshowWidth = defaults.slideshowWidth || obj.find('img').width()+'px';

এটি আরও পরিষ্কার, এটি আরও "জাভাস্ক্রিপ্ট" শৈলী।



1

কোনও অ্যারে বা অবজেক্ট ডিকোলেশনের অভ্যন্তরে কোনও টার্নারি অপারেটর ব্যবহার করতে আপনি ES6 স্প্রেড অপারেটরটি ব্যবহার করতে পারেন ...()

const cond = false;
const arr = [
  ...(cond ? ['a'] : []),
  'b',
];
    // ['b']

এবং বস্তুর জন্য:

const cond = false;
const obj = {
  ...(cond ? {a: 1} : {}),
  b: 2,
};
    // {b: 2}

মূল উৎস

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