জাভাস্ক্রিপ্টে কোনও যৌক্তিক জোর নেই কেন?
জাভাস্ক্রিপ্টে কোনও যৌক্তিক জোর নেই কেন?
উত্তর:
জাভাস্ক্রিপ্ট তার পূর্বসূরিটি সিটিতে ফিরে সনাক্ত করে এবং সি এর কাছে কোনও যৌক্তিক এক্সওআর অপারেটর নেই। মূলত কারণ এটি কার্যকর নয়। বিটওয়াইস এক্সওআর অত্যন্ত কার্যকর, তবে প্রোগ্রামিংয়ের আমার সমস্ত বছরগুলিতে আমার কোনও লজিকাল এক্সওআর দরকার হয়নি।
আপনার যদি দুটি বুলিয়ান ভেরিয়েবল থাকে তবে আপনি XOR এর সাথে নকল করতে পারেন:
if (a != b)
দুটি স্বেচ্ছাচারী ভেরিয়েবলের সাহায্যে আপনি !
তাদের বুলিয়ান মানগুলিকে বাধ্য করতে এবং তার পরে একই কৌশলটি ব্যবহার করতে পারেন:
if (!a != !b)
যদিও এটি বেশ অস্পষ্ট এবং অবশ্যই একটি মন্তব্যের প্রাপ্য। প্রকৃতপক্ষে, আপনি এই মুহুর্তে বিটওয়াইস এক্সওআর অপারেটরটি ব্যবহার করতে পারেন, যদিও এটি আমার স্বাদের জন্য খুব চালাক হবে:
if (!a ^ !b)
জাভাস্ক্রিপ্টটিতে কিছুটা এক্সঅআর অপারেটর রয়েছে: ^
var nb = 5^9 // = 12
আপনি এটি বুলিয়ানগুলির সাথে ব্যবহার করতে পারেন এবং এটি 0 বা 1 হিসাবে ফলাফল দেবে (যা আপনি আবার বুলিয়ান রূপান্তর করতে পারেন, যেমন result = !!(op1 ^ op2)
)। কিন্তু জন যেমন বলেছিলেন, এটি সমান result = (op1 != op2)
, যা পরিষ্কার।
true^true
0, এবং false^true
1
||
এবং &&
নন-বুলিয়ানগুলিতে লজিক্যাল অপারেটর হিসাবে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ 5 || 7
সত্যবাদী মান "bob" && null
ফেরত দেয়, একটি মিথ্যা মান দেয়) তবে তা ^
পারে না। উদাহরণস্বরূপ, 5 ^ 7
সমান 2, যা সত্য।
(true ^ false) !== true
যা এটি এমন লাইব্রেরিগুলিকে বিরক্তিকর করে
a ^= true
বুলিয়ান টগল করতে এক ধরণের ব্যবহার করছিলাম এবং এটি ফোনের মতো কিছু মেশিনে ব্যর্থ হয়।
জাভাস্ক্রিপ্টে কোনও আসল লজিক্যাল বুলিয়ান অপারেটর নেই (যদিও এটি !
বেশ কাছাকাছি আসে)। একটি লজিকাল অপারেটর কেবল অপারেশন হিসাবে গ্রহণ করবে true
বা false
কেবল ফিরে আসবে true
বাfalse
।
জাভাস্ক্রিপ্ট &&
এবং||
সমস্ত ধরণের অপারেশন নিন এবং সমস্ত ধরণের মজাদার ফলাফল (আপনি তাদের মধ্যে যা কিছু খাওয়ান) ফিরিয়ে দিন।
এছাড়াও একটি লজিকাল অপারেটর সর্বদা উভয় অপারেন্ডের মান বিবেচনায় নেওয়া উচিত।
জাভাস্ক্রিপ্টে &&
এবং ||
একটি অলস শর্টকাট নিন এবং নির্দিষ্ট ক্ষেত্রে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করবেন না এবং এর পার্শ্ব প্রতিক্রিয়াগুলিকে অবহেলা করুন। এই আচরণটি একটি লজিকাল জোর দিয়ে পুনরায় তৈরি করা অসম্ভব।
a() && b()
a()
ফলশূন্য হলে মূল্যায়ন করে এবং ফলাফলটি প্রদান করে। অন্যথায় এটি মূল্যায়ন b()
করে ফলাফলটি প্রদান করে। সুতরাং উভয় ফলাফল সত্যবাদী এবং অন্যথায় মিথ্যা বললে প্রত্যাশিত ফলাফল সত্য।
a() || b()
a()
সত্যটি যদি সত্য হয় তবে মূল্যায়ন করে এবং ফলাফলটি প্রদান করে। অন্যথায় এটি মূল্যায়ন b()
করে ফলাফলটি প্রদান করে। সুতরাং উভয় ফলাফল মিথ্যা এবং অন্যথায় সত্যবাদী হলে প্রত্যাশিত ফলাফল মিথ্যা।
সুতরাং সাধারণ ধারণাটি প্রথমে বাম অপারেন্ডকে মূল্যায়ন করা। ডান অপরেন্ড কেবল প্রয়োজন হলে মূল্যায়ন করে। এবং শেষ মান ফলাফল হয়। এই ফলাফল কিছু হতে পারে। বস্তু, সংখ্যা, স্ট্রিং .. যাই হোক না কেন!
এটি এর মতো জিনিস লিখতে সক্ষম করে
image = image || new Image(); // default to a new Image
অথবা
src = image && image.src; // only read out src if we have an image
তবে এই "সত্য" লজিকাল অপারেটরটি সত্য বা মিথ্যা ফিরে আসত কিনা তা সিদ্ধান্ত নিতে এই ফলাফলটির সত্য মানটিও ব্যবহার করা যেতে পারে।
এটি এর মতো জিনিস লিখতে সক্ষম করে
if (typeof image.hasAttribute === 'function' && image.hasAttribute('src')) {
অথবা
if (image.hasAttribute('alt') || image.hasAttribute('title')) {
তবে একটি "যৌক্তিক" এক্সওর অপারেটর ( ^^
) সর্বদা উভয় অপারেশনকে মূল্যায়ন করতে হবে। এটি অন্যান্য "যৌক্তিক" অপারেটরগুলির থেকে পৃথক করে তোলে যা কেবল প্রয়োজন হলে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করে। আমি মনে করি কারণ বিভ্রান্তি এড়াতে জাভাস্ক্রিপ্টে কোনও "যৌক্তিক" জোর নেই।
সুতরাং উভয় অপারেশন মিথ্যা হয় কি হবে? দুজনেই ফেরত দেওয়া যেত। তবে কেবল একজনকেই ফেরানো যায়। কোনটি? প্রথমটি? নাকি দ্বিতীয়টি? আমার অন্তর্নিহিত আমাকে প্রথম কিন্তু সাধারণত "যৌক্তিক" অপারেটরগুলি বাম থেকে ডানে মূল্যায়ন করতে এবং শেষের মূল্যায়িত মানটি ফিরে আসতে বলে। অথবা উভয় মান সমন্বিত একটি অ্যারে হতে পারে?
এবং যদি একটি অপরেন্ড সত্যবাদী হয় এবং অন্য অপারেন্ডটি মিথ্যা হয়, তবে একটি এক্সওরকে সত্যটি ফেরত দেওয়া উচিত। বা সত্যের একটি অ্যারে হতে পারে, এটি পূর্ববর্তী কেসের সাথে সামঞ্জস্য করতে?
এবং পরিশেষে, উভয় অপারেশন সত্যবাদী হলে কি হবে? আপনি মিথ্যা কিছু আশা করবে। তবে কোনও মিথ্যা ফলাফল নেই। সুতরাং অপারেশন কিছু ফিরিয়ে দেওয়া উচিত নয়। তাই হয়তো undefined
বা .. একটি খালি অ্যারে? তবে একটি খালি অ্যারে এখনও সত্য।
অ্যারে পদ্ধতির গ্রহণ করা আপনার পছন্দ মতো শর্তের সাথে শেষ হবে if ((a ^^ b).length !== 1) {
। খুবই বিভ্রান্তিকর.
মানগুলি বুলিয়ান রূপে রূপান্তর করুন তারপরে বিটওয়াইজ এক্সওআর নিন। এটি নন-বুলিয়ান মানগুলিতেও সহায়তা করবে।
Boolean(a) ^ Boolean(b)
এখানে ... সাজান:
if( foo ? !bar : bar ) {
...
}
বা পড়তে সহজ:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
কেন? জানিনা।
কারণ জাভাস্ক্রিপ্ট বিকাশকারীরা ভাবেন যে এটি অপ্রয়োজনীয় হবে কারণ এটি অন্যান্য, ইতিমধ্যে বাস্তবায়িত, লজিকাল অপারেটর দ্বারা প্রকাশ করা যেতে পারে।
আপনি কেবল নান্দ দিয়ে জিততে পারেন এবং এটি চালিয়ে যেতে পারেন, আপনি এটি থেকে অন্য সমস্ত সম্ভাব্য লজিকাল অপারেশনকে প্রভাবিত করতে পারেন।
আমি ব্যক্তিগতভাবে মনে করি যে এর historicalতিহাসিক কারণগুলি রয়েছে যা সি-ভিত্তিক সিনট্যাক্স ভাষা থেকে চালিত হয়, যেখানে আমার জ্ঞানের জ্ঞানের উপস্থিতি নেই বা কমপক্ষে অত্যন্ত অস্বাভাবিক।
হ্যাঁ, কেবল নিম্নলিখিতটি করুন। ধরে নিই যে আপনি বুলেটিয়ান A এবং B নিয়ে কাজ করছেন, তবে নিম্নলিখিতটি ব্যবহার করে জাওস্ক্রিপ্টে A XOR B মান গণনা করা যেতে পারে
var xor1 = !(a === b);
পূর্ববর্তী লাইনটিও নীচের সমতুল্য
var xor2 = (!a !== !b);
ব্যক্তিগতভাবে আমি xor1 পছন্দ করি যেহেতু আমাকে কম অক্ষর টাইপ করতে হয়। আমি বিশ্বাস করি যে এক্সওর 1ও দ্রুত। এটি কেবল দুটি গণনা সম্পাদন করছে। xor2 তিনটি গণনা সম্পাদন করছে।
ভিজ্যুয়াল ব্যাখ্যা ... টেবিল বেলো পড়ুন (যেখানে 0 টি মিথ্যা এবং 1 টি সত্যের জন্য দাঁড়িয়েছে) এবং তৃতীয় এবং 5 তম কলামগুলির তুলনা করুন।
(এ === বি):
| A | B | A XOR B | A === B | !(A === B) |
------------------------------------------
| 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 1 | 0 |
------------------------------------------
উপভোগ করুন।
var xor1 = !(a === b);
হিসাবে একইvar xor1 = a !== b;
!(2 === 3)
হয় true
, কিন্তু 2
ও 3
হয় truthy তাই 2 XOR 3
হওয়া উচিত false
।
চেক আউট:
আপনি এ জাতীয় কিছু অনুকরণ করতে পারেন:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
কিভাবে ফলাফলের রূপান্তর সম্পর্কে int- এ একটি থেকে bool, ডবল অস্বীকৃতি সঙ্গে? এত সুন্দর নয়, তবে সত্যিই কমপ্যাক্ট।
var state1 = false,
state2 = true;
var A = state1 ^ state2; // will become 1
var B = !!(state1 ^ state2); // will become true
console.log(A);
console.log(B);
B = ((!state1)!==(!state2))
B =!!(!state1 ^ !state2);
এতগুলি বন্ধনী কেন? B = !state1 !== !state2;
অথবা আপনি এমনকি অস্বীকৃতি বাদ দিতে পারেন:B = state1 !== state2;
state1 !== state2
, তবে আপনাকে সেখানে !==
কোনও ingালাই করার দরকার নেই, যেহেতু লজিকাল অপারেটর, কিছুটা বিপরীত নয়। 12 !== 4
সত্য 'xy' !== true
সত্য। আপনি যদি এর !=
পরিবর্তে ব্যবহার করেন !==
তবে আপনাকে castালাই করতে হবে।
!==
এবং !=
সর্বদা বুলিয়ান ... আপনি যে পার্থক্যটি সেখানে করছেন তা কী তা নিশ্চিত হওয়া যায় না, এটি একেবারেই সমস্যা নয়। সমস্যাটি হ'ল আমরা যে এক্সওআর অপারেটরটি চাই তা সত্যই প্রকাশ (Boolean(state1) !== Boolean(state2))
। বুলিয়ানদের জন্য, "xy", 12, 4 এবং true
সমস্ত সত্যবাদী মান এবং এগুলিতে রূপান্তর করা উচিত true
। তাই ("xy" XOR true)
হওয়া উচিত false
, কিন্তু ("xy" !== true)
পরিবর্তে true
, আপনি বাতলান। সুতরাং !==
বা !=
(উভয়) "লজিকাল এক্সওআর" এর সমতুল্য এবং কেবল যদি আপনি প্রয়োগের আগে তাদের যুক্তিগুলি বুলিয়ানগুলিতে রূপান্তর করেন ।
উপরে XOR ফাংশন এটি হবে অনুরূপ , ফলে যৌক্তিক XOR ঠিক যৌক্তিক XOR না এটা হবে মানে "সমান মানের জন্য FALSE" এবং "বিভিন্ন মানের জন্য সত্য" বিবেচনা ডাটা টাইপ ম্যাচিং সঙ্গে।
এই XOR ফাংশন প্রকৃত XOR বা লজিক্যাল অপারেটর হিসেবে কাজ করবে , এর পাশ মান এটা সত্য বা মিথ্যা অনুযায়ী হবে মানে truthy বা falsy । আপনার প্রয়োজন অনুযায়ী ব্যবহার করুন
function xor(x,y){return true==(!!x!==!!y);}
function xnor(x,y){return !xor(x,y);}
(!!x) === (!!y)
। পার্থক্য হ'ল বুলিয়ান aালাই। '' === 0
মিথ্যা, যদিও xnor('', 0)
সত্য।
প্রকারভেদে ( সংখ্যার মানতে + পরিবর্তনগুলি):
value : number = (+false ^ +true)
তাই:
value : boolean = (+false ^ +true) == 1
!!(false ^ true)
বুলিয়ানগুলির সাথে দুর্দান্ত কাজ করে। টাইপস্ক্রিপ্টে, + এটি বৈধ করার জন্য প্রয়োজনীয় !!(+false ^ +true)
।
cond1 xor cond2
সমান cond1 + cond 2 == 1
:
প্রমাণ এখানে:
let ops = [[false, false],[false, true], [true, false], [true, true]];
function xor(cond1, cond2){
return cond1 + cond2 == 1;
}
for(op of ops){
console.log(`${op[0]} xor ${op[1]} is ${xor(op[0], op[1])}`)
}
লজিকাল এক্সওআর (^^) না থাকার কারণটি হল && এবং || এর বিপরীতে এটি কোনও অলস-যুক্তিযুক্ত সুবিধা দেয় না। এটি ডান এবং বামে উভয় এক্সপ্রেশনের অবস্থা মূল্যায়ন করতে হবে।
এখানে একটি বিকল্প সমাধান যা 2+ ভেরিয়েবলের সাথে কাজ করে এবং বোনাস হিসাবে গণনা সরবরাহ করে।
যেকোন সত্যবাদী / মিথ্যা মানগুলির জন্য লজিকাল এক্সওর অনুকরণ করার জন্য এখানে আরও সাধারণ সমাধান রয়েছে, ঠিক যেমন যদি আপনার স্ট্যান্ডার্ড আইএফ স্টেটমেন্টে অপারেটর থাকে:
const v1 = true;
const v2 = -1; // truthy (warning, as always)
const v3 = ""; // falsy
const v4 = 783; // truthy
const v5 = false;
if( ( !!v1 + !!v2 + !!v3 + !!v4 + !!v5 ) === 1 )
document.write( `[ ${v1} XOR ${v2} XOR "${v3}" XOR ${v4} XOR ${v5} ] is TRUE!` );
else
document.write( `[ ${v1} XOR ${v2} XOR "${v3}" XOR ${v4} XOR ${v5} ] is FALSE!` );
আমার এটি পছন্দ করার কারণটি হ'ল এটির উত্তর "এইগুলির মধ্যে কতগুলি সত্যবাদী?", তাই আমি সাধারণত ফলাফলটি পূর্ব-সঞ্চয় করি।
এবং যারা কঠোর বুলিয়ান-সত্য xor চেক আচরণ চান, তাদের জন্য ঠিক করুন:
if( ( ( v1===true ) + ( v2===true ) + ( v3===true ) + ( v4===true ) + ( v5===true ) ) === 1 )
// etc.
যদি আপনি গণনা সম্পর্কে চিন্তা করেন না, বা যদি আপনি সর্বোত্তম পারফরম্যান্সের বিষয়ে চিন্তা করেন: তবে সত্যবাদী / মিথ্যা সমাধানের জন্য বুলিয়ানকে জোর করা মানগুলিতে কেবল বিটওয়াইস জোর ব্যবহার করুন:
if( !!v1 ^ !!v2 ^ !!v3 ^ !!v4 ^ !!v5 )
// etc.
আরে আমি জাভাস্ক্রিপ্ট এবং টাইপস্ক্রিপ্টে এক্সওআর তৈরি করতে এই সমাধানটি পেয়েছি।
if( +!!a ^ +!!b )
{
//This happens only when a is true and b is false or a is false and b is true.
}
else
{
//This happens only when a is true and b is true or a is false and b is false
}
এই সংক্ষিপ্ত এবং সহজে একটি বোঝার চেষ্টা করুন
function xor(x,y){return true==(x!==y);}
function xnor(x,y){return !xor(x,y);}
এটি যে কোনও ডেটা ধরণের জন্য কাজ করবে
true == someboolean
প্রয়োজন হয় না, তাই সত্যই, আপনি যা করেছেন তা হ'ল কঠোর সমানকে কোনও ফাংশনে আবৃত করে।
!=
হ'ল আপনি এর মতো কাজটি করতে পারবেন নাa ^= b
কারণa !== b
কেবল কঠোর বৈষম্য অপারেটর।