क्या (a == 1 && a == 2 && a == 3) कभी सच का मूल्यांकन कर सकते हैं?


2484

मॉडरेटर नोट: कृपया कोड को संपादित करने या इस नोटिस को हटाने के आग्रह का विरोध करें। व्हॉट्सएप का पैटर्न प्रश्न का हिस्सा हो सकता है और इसलिए इसमें अनावश्यक रूप से छेड़छाड़ नहीं की जानी चाहिए। यदि आप "व्हाट्सएप महत्वहीन" शिविर में हैं, तो आपको कोड को स्वीकार करने में सक्षम होना चाहिए।

क्या यह कभी संभव है कि जावास्क्रिप्ट में (a== 1 && a ==2 && a==3)मूल्यांकन किया जा सके true?

यह एक प्रमुख टेक कंपनी द्वारा पूछा गया एक साक्षात्कार प्रश्न है। यह दो हफ्ते पहले हुआ था, लेकिन मैं अभी भी इसका जवाब खोजने की कोशिश कर रहा हूं। मुझे पता है कि हम अपने दिन-प्रतिदिन के काम में ऐसा कोड कभी नहीं लिखते हैं, लेकिन मैं उत्सुक हूं।


9
टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
deceze

109
लोगों को जो जाहिरा तौर पर यह बहुत व्यापक के रूप में cloae करने के लिए मतदान किया है : यह है कि जावास्क्रिप्ट पर एक खुदाई, कह रही है कि बहुत सारे वैध जवाब हैं?
tomsmeding

24
कुछ लोग संभव के बारे में दार्शनिकता के आसपास बैठते हैं। अन्य अपने प्रयासों पर ध्यान केंद्रित करते हैं कि वे अपने ग्राहकों के लिए व्यवहार्य, व्यवसाय सही उत्पादों का निर्माण कर रहे हैं या नहीं। IMO, इस प्रश्न की इस तथ्य से परे कोई व्यावहारिक उपयोगिता नहीं है कि आपको साक्षात्कार में इस प्रकार के प्रश्न कभी नहीं पूछने चाहिए या इस तरह का कोड नहीं लिखना चाहिए। इसलिए इसे बंद किया जाना चाहिए। मेरा वास्तव में मतलब है, क्या व्यवसाय को इस बात का एहसास है कि उन्होंने किसी के पास बैठकर इस सामान के बारे में बात करने के लिए असली पैसे का भुगतान किया है?
पी। ब्रायन। मैके

15
उत्तर पढ़ने के बाद, कहानी के नैतिकताएं हैं: ==जब आप मतलब करते हैं ===, तो उपयोग न करें , एक कोडिंग मानक है जो गैर-एएससीआईआई चर नाम पर प्रतिबंध लगाता है, और एक लाइनिंग प्रक्रिया होती है जो पिछले दो नैतिकता को लागू करती है।
जेसी सी। स्लीकर

87
मॉडरेटर नोट: स्टैक ओवरफ्लो में विभिन्न भाषाओं में जवाब देने वाले लोगों के इतिहास का इतिहास रहा है। ये हैं सवाल का जवाब देने के कारण वे सामान्य समस्या का समाधान कर रहे हैं, एक अलग भाषा में यद्यपि प्रयास। कृपया उन्हें "एक उत्तर नहीं" के रूप में चिह्नित करने से बचना चाहिए। यह कहने के बाद, कृपया विभिन्न भाषाओं में अधिक उत्तर पोस्ट करने से भी बचें - यह एक कारण है कि यह प्रश्न जावास्क्रिप्ट के लिए विशिष्ट है, जैसा कि इनमें से कुछ अन्य उत्तरों के तहत टिप्पणियों द्वारा बताया गया है, और एक कारण है कि हम अपनी भाषा-विशिष्ट प्रश्नों को पसंद करते हैं ऐसा ही रहना।
BoltClock

जवाबों:


3323

यदि आप इस बात का लाभ उठाते हैं कि कैसे ==काम करता है , तो आप बस एक कस्टम toString(या valueOf) फ़ंक्शन के साथ एक ऑब्जेक्ट बना सकते हैं जो हर बार उपयोग होने वाले रिटर्न को बदल देता है जैसे कि यह तीनों स्थितियों को संतुष्ट करता है।

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}


यह कार्य ढीले समानता ऑपरेटर के उपयोग के कारण होता है। ढीली समानता का उपयोग करते समय, यदि ऑपरेंड में से एक दूसरे से अलग प्रकार का है, तो इंजन एक को दूसरे में बदलने का प्रयास करेगा। बाईं ओर एक ऑब्जेक्ट और दाईं ओर एक नंबर के मामले में, यह कॉल करने योग्य valueOfहोने पर पहले कॉल करके ऑब्जेक्ट को नंबर में बदलने का प्रयास करेगा , और असफल होने पर, यह कॉल करेगा toString। मैंने toStringइस मामले में सिर्फ इसलिए इस्तेमाल किया क्योंकि यह मन में आया था, valueOfऔर समझ में आएगा। अगर मैं इसके बजाय एक स्ट्रिंग लौटाता हूं toString, तो इंजन ने स्ट्रिंग को संख्या में बदलने का प्रयास किया होगा, जो हमें एक ही अंतिम परिणाम देगा, हालांकि थोड़े लंबे रास्ते के साथ।


70
क्या आप निहित valueOf()ऑपरेशन में बदलाव करके इसे हासिल कर सकते हैं ?
स्टर्लिंग आर्चर

43
हाँ, valueOf एक ही कारण के लिए स्ट्रिंग के स्थान पर काम करता है
केविन बी

4
टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
deceze

13
के अनुसार इस एक नंबर रूपांतरण पहले की कोशिश की हो जाएंगे, इसलिए valueOfथोड़ा बेहतर है।
सलमान ए

6
@ बराबरी की तुलना के बाएं हाथ की ओर एक वस्तु है, एक संख्या नहीं है। उस ऑब्जेक्ट में एक नंबर प्रॉपर्टी होती iहै जो इंजन को परेशान नहीं करती है। ;)
13-16 को

2057

मैं विरोध नहीं कर सका - अन्य उत्तर निस्संदेह सत्य हैं, लेकिन आप वास्तव में निम्नलिखित कोड से नहीं चल सकते:

var a = 1;
var a = 2;
var a = 3;
if(aᅠ==1 && a== 2 &&ᅠa==3) {
    console.log("Why hello there!")
}

ifस्टेटमेंट में अजीब रिक्ति पर ध्यान दें (जो मैंने आपके प्रश्न से कॉपी की है)। यह हाफ-चौड़ाई हंगुल है (यह उन लोगों के लिए कोरियाई है जो परिचित नहीं हैं) जो एक यूनिकोड स्पेस कैरेक्टर है जिसे ईसीएमए स्क्रिप्ट द्वारा स्पेस कैरेक्टर के रूप में व्याख्यायित नहीं किया गया है - इसका मतलब है कि यह एक पहचानकर्ता के लिए एक वैध चरित्र है। इसलिए तीन पूरी तरह से अलग-अलग चर हैं, एक के बाद हंगुल के साथ, एक इसके पहले और एक आखिरी के साथ। _पठनीयता के साथ अंतरिक्ष की जगह , एक ही कोड इस तरह दिखेगा:

var a_ = 1;
var a = 2;
var _a = 3;
if(a_==1 && a== 2 &&_a==3) {
    console.log("Why hello there!")
}

मैथियास के चर नाम सत्यापनकर्ता पर सत्यापन देखें । यदि वास्तव में यह अजीब रिक्ति उनके प्रश्न में शामिल थी, तो मुझे यकीन है कि यह इस तरह के उत्तर के लिए संकेत है।

यह मत करो। गंभीरता से।

संपादित करें: यह मेरे ध्यान में आया है कि (हालांकि एक चर शुरू करने की अनुमति नहीं है) शून्य-चौड़ाई वाले योजक और शून्य-चौड़ाई वाले गैर-योजक वर्णों को भी चर नामों में अनुमति दी गई है - शून्य-चौड़ाई वाले वर्णों के साथ जावास्क्रिप्ट को अस्पष्ट करना देखें - पेशेवरों और विपक्ष ?

यह निम्नलिखित की तरह दिखेगा:

var a= 1;
var a‍= 2; //one zero-width character
var a‍‍= 3; //two zero-width characters (or you can use the other one)
if(a==1&&a‍==2&&a‍‍==3) {
    console.log("Why hello there!")
}


368
मूल प्रश्न में विषम अंतर को देखते हुए, मुझे लगता है कि यह वास्तव में उत्तर है जो साक्षात्कार प्रश्न की तलाश में था - गैर-अंतरिक्ष वर्णों का शोषण करना जो रिक्त स्थान की तरह दिखते हैं। अच्छी जगह!
बाराकस

18
@ बाराकस यह रॉन जॉन था जिसने केविन के जवाब पर अपनी टिप्पणी में अजीब अंतर देखा, जिसने मुझे इस (भयानक) तकनीक की याद दिला दी, इसलिए मैं इसे हाजिर करने का श्रेय नहीं ले सकता। मैं थोड़े आश्चर्यचकित था कि किसी ने पहले ही इस बात का जवाब नहीं दिया था, क्योंकि यह कुछ साल पहले मेरे काम के आसपास चला गया था क्योंकि एक ब्लॉग पोस्ट कहीं - मुझे लगता है कि यह अब तक बहुत सामान्य ज्ञान था।
जेफ

102
बेशक, यह एक मानक खामियों के रूप में प्रतिबंधित है , जो साक्षात्कारों पर भी लागू होता है। [उद्धरण वांछित]
Sanchises

13
मूल रिक्ति को ध्यान में रखते हुए, यह और भी खराब हो सकता है, अर्थात एक चर var ᅠ2 = 3का उपयोग किया गया है; तो वहाँ तीन चर रहे हैं aᅠᅠ= 1, ᅠ2 = 3, a = 3( a␣ = 1, ␣2 = 3, a = 3ताकि, (a␣==1 && a==␣2 && a==3)) ...
Holger

2
@ AL-zami में दो चरों में एक अतिरिक्त वर्ण होता है, जो आपकी स्क्रीन पर एक स्थान के रूप में दिखाई देता है, लेकिन पहचानकर्ता के हिस्से के रूप में व्याख्या की जाती है, जिसका अर्थ है कि तीन अलग-अलग चर हैं - a, a और a - अतिरिक्त वर्ण है हंगुल आधी-चौड़ाई वाली जगह।
जेफ

620

यह संभव है!

var i = 0;

with({
  get a() {
    return ++i;
  }
}) {
  if (a == 1 && a == 2 && a == 3)
    console.log("wohoo");
}

यह तीन अलग-अलग मूल्यों का मूल्यांकन करने के withलिए एक बयान के अंदर एक गेट्टर का उपयोग करता है a

... इसका मतलब यह नहीं है कि यह वास्तविक कोड में इस्तेमाल किया जाना चाहिए ...

इससे भी बदतर, इस चाल के उपयोग के साथ भी काम करेगा ===

  var i = 0;

  with({
    get a() {
      return ++i;
    }
  }) {
    if (a !== a)
      console.log("yep, this is printed.");
  }


65
हां मैं एक ही बात की कोशिश कर रहा था :) तो साक्षात्कार में सही उत्तर होगा, "यह मेरे कोड में नहीं हो सकता क्योंकि मैं कभी उपयोग नहीं करता with।"
पॉंच

7
@ पोंटी - और, मैं सख्त मोड में कार्यक्रम करता हूं जहां withअनुमति नहीं है।
jfriend00

6
@ जवाब में स्वीकार किए जाते हैं कि वे कुछ ऐसा ही करते हैं, withतो ऐसा हो सकता है
Jungkook

2
@jorrit कोई उपयोग नहीं करेगा ==। और ===स्वीकृत जवाब को रोकता है
जोनास विल्म्स

4
@JonasW। बहुत सारे लोग अभी भी उपयोग करते हैं ==लेकिन मैंने तब से नहीं देखा withहै ... वास्तव में जेएस प्रलेखन के बाहर वास्तव में कभी नहीं था, जहां यह कहता है कि "कृपया इसका उपयोग न करें"। वैसे भी, एक अच्छा समाधान।
वार्टवार्ट

516

बिना गेटर्स या वैल्यू के उदाहरण:

a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);

यह काम करता है क्योंकि ==इनवोक करता है toStringजो .joinArrays कहता है।

एक अन्य समाधान, Symbol.toPrimitiveजिसका उपयोग करना ES6 के बराबर है toString/valueOf:

let i = 0;
let a = { [Symbol.toPrimitive]: () => ++i };

console.log(a == 1 && a == 2 && a == 3);


9
without valueOf, अच्छी तरह से ... इसके अधिक अप्रत्यक्ष लेकिन मूल रूप से एक ही बात है।
जोनास विलम्स

11
मैं वास्तव में इस समाधान को पसंद करता हूं क्योंकि आप कुछ भी नहीं ओवरराइड करते हैं, लेकिन ऑब्जेक्ट स्वयं फ़ंक्शन में शामिल होते हैं, और यह हैक को पढ़ने के लिए बहुत साफ और आसान है जो तर्क का सही मूल्यांकन करता है।
एलेक्स पेडरसेन

28
ईमानदारी से मुझे लगता है कि यह सबसे अच्छा जवाब है। इसमें कुछ भी सामान्य नहीं है, बस कुछ मान सेट करना है। बुनियादी जेएस ज्ञान के साथ भी समझना बहुत आसान है। बहुत बढ़िया।
Zac Delventhal

14
यह इतना समझ में आता है कि यह लगभग उपयोगी लगता है।
एंड्रयू

7
मुझे पता था कि ज्यादातर जवाब गाली देने के बारे में होंगे toStringया valueOfलेकिन इसने मुझे पूरी तरह से बाहर कर दिया। बहुत चतुर और मुझे नहीं पता था कि यह .joinआंतरिक रूप से कॉल किया था , लेकिन यह कुल समझ में आता है।
GBarroso

268

यदि यह पूछा जाता है कि क्या यह संभव है (जरूरी नहीं), यह एक यादृच्छिक संख्या को वापस करने के लिए "ए" पूछ सकता है। यह सच होगा अगर यह 1, 2, और 3 क्रमिक रूप से उत्पन्न करता है।

with({
  get a() {
    return Math.floor(Math.random()*4);
  }
}){
  for(var i=0;i<1000;i++){
    if (a == 1 && a == 2 && a == 3){
      console.log("after " + (i+1) + " trials, it becomes true finally!!!");
      break;
    }
  }
}


102
अगर मैं अन्य समाधान जानता था तो भी मैं जानबूझकर यह जवाब दूंगा, क्योंकि यह सवाल का जवाब देता है लेकिन जाहिर है कि वे इसके बाद नहीं थे। बेवकूफ खेल खेलते हैं, बेवकूफ पुरस्कार जीतते हैं।
ईएसआर

2
लेकिन क्या होगा अगर यह 1000 से अधिक परीक्षण करे?
पियिन

9
@Piyin यदि यह 1000 से अधिक परीक्षण लेता है तो आप एक पुरस्कार जीतते हैं!
स्कीट्स

5
मुझे यह उत्तर पसंद है क्योंकि इसे चरम पर ले जाने से पता चलता है कि यह किसी भी भाषा में संभव है यदि प्रोग्राम चलने के दौरान सीपीयू के रजिस्टर / कैश पर्याप्त कॉस्मिक किरणों के साथ टकरा जाते हैं, या यदि कोई जानबूझकर पावर गड़बड़ करता है, तो विफलता शाखा अगर सशर्त वास्तव में नहीं कूदता है।
पोंकडूडल

निम्नतम: 1, उच्चतम:
412.

210

जब आप नियमित अभिव्यक्ति के बिना कुछ नहीं कर सकते हैं:

var a = {
  r: /\d/g, 
  valueOf: function(){
    return this.r.exec(123)[0]
  }
}

if (a == 1 && a == 2 && a == 3) {
    console.log("!")
}

यह कस्टम valueOfविधि की वजह से काम करता है जिसे जब आदिम (जैसे संख्या) के साथ तुलना की जाती है। मुख्य चाल यह है कि a.valueOfहर बार नया मूल्य लौटाता है क्योंकि यह ध्वज के execसाथ नियमित अभिव्यक्ति पर कॉल कर रहा है g, जिससे lastIndexहर बार मैच के दौरान उस नियमित अभिव्यक्ति का अद्यतन होता है। तो पहली बार this.r.lastIndex == 0, यह मेल खाता है 1और अद्यतन करता है lastIndex: this.r.lastIndex == 1तो अगली बार रेगेक्स 2और इसी तरह मेल खाएगा ।


22
@Addillah एक regex ऑब्जेक्ट आखिरी इंडेक्स को याद करेगा जो उसके मेल खाता है, कॉल execफिर से उस इंडेक्स से खोजना शुरू कर देगा। एमडीएन बहुत स्पष्ट नहीं है।
साइमन चान

मैं देखता हूं, इसलिए this.rरेगेक्स ऑब्जेक्ट राज्य / सूचकांक को याद करता है। धन्यवाद!
अब्दिला

मैं एक स्ट्रिंग को पारित करने की सलाह execदूंगा, हालांकि, एक पूर्णांक को कड़े नहीं किया जाना चाहिए।
बर्गी

रेगेक्स का उपयोग करें और अब आपको दो समस्याएं हैं
अलेक्सी सोलोवै

191

यह वैश्विक दायरे में निम्नलिखित का उपयोग करके पूरा किया जा सकता है। नीचे दिए गए कोड के बजाय nodejsउपयोग के लिए ।globalwindow

var val = 0;
Object.defineProperty(window, 'a', {
  get: function() {
    return ++val;
  }
});
if (a == 1 && a == 2 && a == 3) {
  console.log('yay');
}

यह उत्तर वैश्विक परिमाण द्वारा प्रदान किए गए निहित चर का दुरुपयोग करता है, चर को पुनः प्राप्त करने के लिए एक गेटर को परिभाषित करके।


यह मान लिया गया aहै कि यह एक संपत्ति thisहै। यदि aएक स्थानीय चर था (जो ऐसा दिखता है), तो यह काम नहीं करेगा।
jfriend00

1
@ jfriend00 का मतलब है अगर आपने var a रखा है; कहीं?
जोंत्रो

हाँ। कहीं a == 1से भी संदर्भित aएक चर है, की संपत्ति नहीं है this। जबकि ग्लोबल्स जैसी एक विषम जगह होती है, जहां दोनों सही हो सकते हैं, आम तौर पर, इसके साथ एक चर की घोषणा करते हुए var aया let aइसका कोई मतलब नहीं है thisकि आप aएक संपत्ति के रूप में एक्सेस कर सकते हैं जैसे आप कोड मान लेते हैं। तो, आपका कोड स्पष्ट रूप से कुछ अजीब वैश्विक चर चीज़ मान रहा है। उदाहरण के लिए, आपका कोड नोड में काम नहीं करता है। जेएस और फ़ंक्शन के अंदर सख्त मोड में नहीं। आपको सटीक परिस्थितियों को निर्दिष्ट करना चाहिए जहां यह काम करता है और शायद समझाता है कि यह क्यों काम करता है। अन्यथा, यह भ्रामक है।
२०

@ jfriend00 अच्छी तरह से यकीन है। यकीन नहीं है कि यह पहले से ही अन्य जवाब के साथ संयोजन में बहुत अधिक मूल्य जोड़ देगा। उत्तर को अपडेट करेगा
जोंत्रो

14
सवाल यह था कि क्या यह "कभी" सच हो सकता है। और इसका उत्तर हां है, और यह उन परिदृश्यों में से एक है जहां यह सच हो सकता है: aएक स्थानीय चर नहीं है और एक वृद्धि करने वाले गटर के साथ वैश्विक दायरे में परिभाषित किया गया है।
ज़ैक डेल्वेंथल

190

चर aद्वारा एक्सेस किए जाने के मामले में यह संभव है, 2 वेब कर्मचारियों को एक SharedArrayBuffer और साथ ही कुछ मुख्य स्क्रिप्ट के माध्यम से कहें। संभावना कम है, लेकिन यह संभव है कि जब कोड मशीन कोड को संकलित किया गया है, वेब श्रमिकों चर का अद्यतन aसिर्फ इसलिए की स्थिति के समय में a==1, a==2और a==3संतुष्ट हैं।

यह जावास्क्रिप्ट में वेब श्रमिकों और SharedArrayBuffer द्वारा प्रदान किए गए बहु-थ्रेडेड वातावरण में दौड़ की स्थिति का एक उदाहरण हो सकता है।

यहाँ ऊपर का मूल कार्यान्वयन है:

main.js

// Main Thread

const worker = new Worker('worker.js')
const modifiers = [new Worker('modifier.js'), new Worker('modifier.js')] // Let's use 2 workers
const sab = new SharedArrayBuffer(1)

modifiers.forEach(m => m.postMessage(sab))
worker.postMessage(sab)

worker.js

let array

Object.defineProperty(self, 'a', {
  get() {
    return array[0]
  }
});

addEventListener('message', ({data}) => {
    array = new Uint8Array(data)
    let count = 0
    do {
        var res = a == 1 && a == 2 && a == 3
        ++count
    } while(res == false) // just for clarity. !res is fine
    console.log(`It happened after ${count} iterations`)
    console.log('You should\'ve never seen this')
})

modifier.js

addEventListener('message' , ({data}) => {
    setInterval( () => {
        new Uint8Array(data)[0] = Math.floor(Math.random()*3) + 1
    })
})

मेरे मैकबुक एयर पर, पहले प्रयास में लगभग 10 बिलियन पुनरावृत्तियों के बाद ऐसा होता है:

यहां छवि विवरण दर्ज करें

दूसरा प्रयास:

यहां छवि विवरण दर्ज करें

जैसा कि मैंने कहा, संभावना कम होगी, लेकिन पर्याप्त समय दिया गया, यह स्थिति को प्रभावित करेगा।

युक्ति: यदि आपके सिस्टम पर बहुत लंबा समय लगता है। केवल प्रयास करें a == 1 && a == 2और परिवर्तन Math.random()*3करने के लिए Math.random()*2। अधिक से अधिक सूची में जोड़ने से मारने की संभावना कम हो जाती है।


50
ईमानदारी से, यह सबसे अच्छा जवाब है। अन्य सभी जवाबों के लिए एक जानबूझकर प्रयास करने की आवश्यकता होती है ताकि वे गहराई से कुछ कर सकें। यह उत्तर वास्तव में कुछ ऐसा दर्शाता है जो वास्तविक दुनिया में हो सकता है - एक दौड़ की स्थिति।
टॉम स्विरली

34
इतना ही नहीं - मैंने वास्तव में वास्तविक दुनिया में ऐसा होते देखा है। सवाल में सटीक स्थिति के साथ नहीं, लेकिन निश्चित रूप से एक समारोह की शुरुआत में (एक == 1) की जाँच के साथ और (एक == 2) बाद में समारोह में, और कोड होने से दोनों स्थितियों को प्रभावित किया। FYI करें, पहली बार मैंने देखा कि यह एक कार इंजन नियंत्रक में था, और हमने जगह में कोडिंग मानकों को रखा। दूसरी बार सैन्य विमानों के लिए एक चफ और भड़कने वाली डिस्पेंसर प्रणाली में था, और कंपनी में अपने पहले दिन मैंने इसे पाया और इसे ठीक कर दिया, जबकि बाकी टीम अभी भी समस्या पर चर्चा कर रही थी। (कुडोस स्तर: उच्च! :)
ग्राहम

38
तो, आपने "कार इंजन कंट्रोलर्स" और "चैफ एंड फ्लेयर डिस्पेंसर सिस्टम" पर काम किया है, जो वेब वर्कर्स के साथ जावास्क्रिप्ट में प्रोग्राम किए जाते हैं? मुझे नहीं लगता कि मैं फिर से बाहर जाऊंगा।
21

12
@psaxton :) बेशक नहीं - लेकिन हमारे पास साझा डेटा के साथ बहु-थ्रेडेड सॉफ़्टवेयर है। यह सभी मल्टी-थ्रेडेड सॉफ़्टवेयर के लिए एक विरोधी पैटर्न है, जो जावास्क्रिप्ट या वेब वर्कर्स के लिए विशिष्ट नहीं है। इससे कोई फर्क नहीं पड़ता कि आप असेंबली लैंग्वेज में प्रोग्रामिंग कर रहे हैं, ब्रेनफ * सीके, विजुअल बेसिक, सी या जावास्क्रिप्ट - अगर आप मल्टी-थ्रेडेड एप्लिकेशन में साझा डेटा के साथ ऐसा करते हैं, तो यह हमेशा विफल रहेगा।
ग्राहम

4
मुझे लगता है कि यह @ jontro के उत्तर के आसपास अब एक विस्तृत आवरण है।
केंटम

148

स्व-ओवरराइटिंग गेटर्स की एक श्रृंखला का उपयोग करना भी संभव है:

(यह जोंरो के समाधान के समान है, लेकिन काउंटर चर की आवश्यकता नहीं है।)

(() => {
    "use strict";
    Object.defineProperty(this, "a", {
        "get": () => {
            Object.defineProperty(this, "a", {
                "get": () => {
                    Object.defineProperty(this, "a", {
                        "get": () => {
                            return 3;
                        }
                    });
                    return 2;
                },
                configurable: true
            });
            return 1;
        },
        configurable: true
    });
    if (a == 1 && a == 2 && a == 3) {
        document.body.append("Yes, it’s possible.");
    }
})();


61
ध्यान दें कि एक गेट्टर का उपयोग करने का दृष्टिकोण भी साथ काम करता है ===, न कि सिर्फ ==
मकेन

यह समाधान thisएरो फ़ंक्शन के शरीर के अंदर वैश्विक ऑब्जेक्ट होने पर निर्भर करता है ।
रॉय टिंकर

@Midnightas मैं "पिरामिड कोड" के रूप में किसी अन्य उत्तर को वर्गीकृत नहीं करूंगा ।
पैट्रिक रॉबर्ट्स

नोट यह भी मनमाने ढंग से आदेश के साथ काम करता है, है ना? की तरह (a == 3 && a == 2 && a == 1)?
जोहान्स

131

वैकल्पिक रूप से, आप इसके लिए एक वर्ग और चेक के लिए एक उदाहरण का उपयोग कर सकते हैं।

function A() {
    var value = 0;
    this.valueOf = function () { return ++value; };
}

var a = new A;

if (a == 1 && a == 2 && a == 3) {
    console.log('bingo!');
}

संपादित करें

ईएस 6 कक्षाओं का उपयोग करना इस तरह दिखेगा

class A {
  constructor() {
    this.value = 0;
    this.valueOf();
  }
  valueOf() {
    return this.value++;
  };
}

let a = new A;

if (a == 1 && a == 2 && a == 3) {
  console.log('bingo!');
}


5
बस function A() {value = 0;शुरुआत में?
डेव सी

valueOfओवरराइड किया जा रहा है, this method is usually called automatically by JavaScript behind the scenes, and not explicitly in codeइसलिए जब हम मूल्य की तुलना करते हैं तो यह वास्तव में वेतन वृद्धि करता है ..
Danyal Sandeelo

130

मैं पहले से ही पोस्ट किए गए इस जवाब को नहीं देख रहा हूं, इसलिए मैं इस मिश्रण में भी फेंक दूंगा। यह हाफ-चौड़ाई हंगुल स्पेस के साथ जेफ के जवाब के समान है।

var a = 1;
var  = 2;
var а = 3;
if(a == 1 &&  == 2 && а == 3) {
    console.log("Why hello there!")
}

आप दूसरे के साथ थोड़ी असावधानी देख सकते हैं, लेकिन पहली और तीसरी नग्न आंखों के समान हैं। सभी 3 विशिष्ट वर्ण हैं:

a- लैटिन निचला केस A
- पूर्ण चौड़ाई लैटिन निचला केस A
а- सिरिलिक लोअर केस A

इसके लिए सामान्य शब्द "होमोग्लाइफ्स" है: विभिन्न यूनिकोड वर्ण जो समान दिखते हैं। आमतौर पर तीन पाने के लिए कठिन है कि पूरी तरह से अप्रभेद्य हैं, लेकिन कुछ मामलों में आप भाग्यशाली हो सकते हैं। ए, Α, А, और Ꭺ बेहतर काम करेगा (लैटिन-ए, यूनानी अल्फा , सिरिलिक-ए , और चेरोकी-ए ; क्रमशः दुर्भाग्य से ग्रीक और चेरोकी छोटे अक्षरों लैटिन से भी अलग हैं a: α, , और इतने नहीं करता है 'उपरोक्त स्निपेट के साथ टी मदद)।

वहाँ पूरी तरह से होमोग्लिफ़ हमलों की एक पूरी कक्षा है, सबसे आम तौर पर नकली डोमेन नाम (जैसे। wikipediа.org(सिरिलिक) बनाम wikipedia.org(लैटिन)), लेकिन यह कोड में भी दिखा सकता है; आमतौर पर अंडरहैंड होने के रूप में संदर्भित किया जाता है (जैसा कि एक टिप्पणी में उल्लेख किया गया है, [ अंडरहैंड ] सवाल अब पीपीसीजी पर ऑफ- टॉपिक हैं , लेकिन एक प्रकार की चुनौती हुआ करती थी जहां इस प्रकार की चीजें दिखाई देती थीं)। मैंने इस उत्तर के लिए उपयोग की जाने वाली सजातीय खोजने के लिए इस वेबसाइट का उपयोग किया।


19
"थोड़ा विसंगति" यह नहीं है कि मैं यह कैसे कहूंगा।

4
@hvd पूरी तरह से आपके फ़ॉन्ट रेंडरिंग पर निर्भर करता है। यह मैं देख रहा हूं
Draco18s अब SE

1
@ जेक हाँ, पूर्ण चौड़ाई लैटिन लोअर केस ए सबसे महान सजातीय नहीं है (लेकिन कैपिटल-अक्षर वेरिएंट अद्भुत हैं)। आम तौर पर यद्यपि आपको वांछित प्रभाव प्राप्त करने के लिए केवल दो की आवश्यकता होती है।
Draco18s अब SE

@ Draco18s सहमत फिर से: केवल 2 आमतौर पर की जरूरत है। अतिरिक्त जानकारी पर भी अच्छा काम!
जेकस्टेम

10
आप यूनिकोड वेरिएंट सेलेक्टर (U + FE00..U + FE0F) का भी उपयोग कर सकते हैं। इनमें से कोई नहीं कर रहे हैं a: a︀ a︁ a︂। विसंगतियों के बारे में अधिक चिंता नहीं।
सलमान ए

108

हाँ यह संभव है! 😎

»जावास्क्रिप्ट

if‌=()=>!0;
var a = 9;

if‌(a==1 && a== 2 && a==3)
{
    document.write("<h1>Yes, it is possible!😎</h1>")
}

उपरोक्त कोड एक छोटा संस्करण है (टिप्पणियों में इसके नोट के लिए @Forivin के लिए धन्यवाद) और निम्नलिखित कोड मूल है:

var a = 9;

if‌(a==1 && a== 2 && a==3)
{
    //console.log("Yes, it is possible!😎")
    document.write("<h1>Yes, it is possible!😎</h1>")
}

//--------------------------------------------

function if‌(){return true;}

यदि आप सिर्फ मेरे कोड के ऊपर की ओर देखते हैं और इसे चलाते हैं तो आप कहते हैं वाह, कैसे?

तो मुझे लगता है कि यह कहने के लिए पर्याप्त है हाँ, यह संभव है कि किसी ने आपसे कहा: कुछ भी असंभव नहीं है

ट्रिक: मैंने ifएक फंक्शन बनाने के बाद एक छिपे हुए पात्र का इस्तेमाल किया जिसका नाम इसके जैसा है if। जावास्क्रिप्ट में हम कीवर्ड को ओवरराइड नहीं कर सकते हैं इसलिए मैंने इस तरह से उपयोग करने के लिए मजबूर किया। यह एक नकली है if, लेकिन यह इस मामले में आपके लिए काम करता है!


» सी #

इसके अलावा, मैंने एक C # संस्करण ( संपत्ति के मूल्य में वृद्धि के साथ ) लिखा है :

static int _a;
public static int a => ++_a;

public static void Main()
{
    if(a==1 && a==2 && a==3)
    {
        Console.WriteLine("Yes, it is possible!😎");
    }
}

लाइव डेमो


56
जावास्क्रिप्ट संस्करण मानवता के खिलाफ एक सच्चा अपराध है और ऐसा करने की क्षमता, संयुक्त राष्ट्र के सम्मेलनों द्वारा अवैध होनी चाहिए। मुझे लगता है कि यह समय के बारे में है जब हम javacript के सभी ज्ञान की दुनिया को शुद्ध करते हैं।
क्लियर

2
फ़ंक्शन की घोषणा और भी कम हो सकती है। if‌=()=>!0
फोरविन

4
आपने धरती पर क्यों इस्तेमाल किया document.write? यह एक निश्चित तरीका है कि बाकी जवाब की परवाह किए बिना काम पर नहीं रखा जाए।
सेरेब्रस

3
@ केरब्रस, आपके नोट के लिए धन्यवाद। मैंने अपना जवाब पहले लिखा था console.logलेकिन मैंने इसे दस्तावेज़ में बदल दिया। वास्तव में हमेशा मैं console.logअपने कोड में उपयोग करता हूं, लेकिन यहां मैं केवल StackOverflow कोड स्निपेट बॉक्स में उपयोगकर्ताओं को एक पाठ दिखाना चाहता हूं। इसलिए मैं अपने संदेश को उत्पन्न संदेश से अधिक सुंदर दिखाना चाहता था console.logRun Code Snippetमेरे उत्तर पर और अन्य उत्तरों पर बटन पर क्लिक करें । SO कोड स्निपेट ने मुझे html और JS और CSS का उपयोग करने दिया, फिर मैं अपने उत्तर में इसका उपयोग करना चाहता था और इसे अच्छा बनाता था। मुझे लगता है कि इसका कोई नकारात्मक साइड इफेक्ट नहीं है और इसने मेरे जवाब को बड़ा या मजबूर नहीं किया।
RAM

1
@ क्लेयर, अगर यूएन-कन्वेंशन दुनिया को प्रभावी रूप से बदल सकते हैं, तो हमारे पास इससे बेहतर दुनिया होनी चाहिए। हमें संयुक्त राष्ट्र में बयान से ज्यादा सोम की जरूरत है और उस दिन तक मुझे लगता है कि हम इस जावास्क्रिप्ट ट्रिक का इस्तेमाल कर सकते हैं;)
RAM

97

जावास्क्रिप्ट

a == ए १

जावास्क्रिप्ट में, पूर्णांक नहीं होते हैं, लेकिन केवल Numberएस होते हैं, जो कि दोहरे सटीक फ्लोटिंग पॉइंट नंबरों के रूप में कार्यान्वित किए जाते हैं।

इसका अर्थ है कि यदि कोई संख्या aपर्याप्त बड़ी है, तो इसे लगातार तीन पूर्णांक के बराबर माना जा सकता है:

a = 100000000000000000
if (a == a+1 && a == a+2 && a == a+3){
  console.log("Precision loss!");
}

सच है, यह बिल्कुल नहीं है कि साक्षात्कारकर्ता ने पूछा (यह साथ काम नहीं करता है a=0), लेकिन इसमें छिपे हुए कार्यों या ऑपरेटर के ओवरलोडिंग के साथ कोई चाल शामिल नहीं है।

अन्य भाषाएँ

संदर्भ के लिए, a==1 && a==2 && a==3रूबी और पायथन में समाधान हैं । मामूली संशोधन के साथ, यह जावा में भी संभव है।

माणिक

एक रिवाज के साथ ==:

class A
  def ==(o)
    true
  end
end

a = A.new

if a == 1 && a == 2 && a == 3
  puts "Don't do this!"
end

या एक वृद्धि a:

def a
  @a ||= 0
  @a += 1
end

if a == 1 && a == 2 && a == 3
  puts "Don't do this!"
end

अजगर

class A:
    def __eq__(self, who_cares):
        return True
a = A()

if a == 1 and a == 2 and a == 3:
    print("Don't do that!")

जावा

जावा Integerकैश को संशोधित करना संभव है :

package stackoverflow;

import java.lang.reflect.Field;

public class IntegerMess
{
    public static void main(String[] args) throws Exception {
        Field valueField = Integer.class.getDeclaredField("value");
        valueField.setAccessible(true);
        valueField.setInt(1, valueField.getInt(42));
        valueField.setInt(2, valueField.getInt(42));
        valueField.setInt(3, valueField.getInt(42));
        valueField.setAccessible(false);

        Integer a = 42;

        if (a.equals(1) && a.equals(2) && a.equals(3)) {
            System.out.println("Bad idea.");
        }
    }
}

27
@ c @say: जावा, जावास्क्रिप्ट, पोटैटो, पोटाहो :) जेएस के पहले से ही काफी अच्छे जवाब हैं। मैंने अभी सोचा कि यह दिखाना दिलचस्प होगा कि यह अन्य भाषाओं में कैसे किया जा सकता है, और संभवतः जेएस डेवलपर्स को कुछ विचार दे सकते हैं।
एरिक डुमिनील

2
@ c @sᴏʟᴅ: जेएस उदाहरण के साथ अपडेट किया गया।
एरिक डुमिनील

1
जावा संस्करण Integer a = 42(या ऐसा क्यों नहीं) के साथ काम नहीं करता है? जैसा कि मैं ऑटोबॉक्सिंग को समझता हूं, Integer a = 42; a == 1 && a == 2 && a == 3सभी चींटियों को बॉक्स करना चाहिए। या तुलना के लिए यह अनबॉक्स नहीं है?
सीएडी 97

@ CAD97: अनबॉक्सिंग Integer == intमें परिणाम प्रतीत होता है। लेकिन Integer#equals(int)बलों को ऑटोबॉक्सिंग का उपयोग करना , इसलिए यह काम करता है। टिप्पणी के लिए धन्यवाद!
एरिक डुमिनील

@StephanBijzitter: कृपया समझाएं। जहां तक ​​मुझे पता है, Numbersजेएस में केवल वही हैं , जो मूल रूप से एस जैसे हैं double। वे पूर्णांक की तरह दिख सकते हैं और आप उन्हें पूर्णांक की तरह उपयोग कर सकते हैं, लेकिन वे अभी भी पूर्णांक नहीं हैं। मुझे नहीं लगता कि n == n + 1कभी जावा / पायथन / सी / रूबी में / ... पूर्णांकों के लिए सच हो सकता है
एरिक Duminil

80

यह @ जेफ के उत्तर * का एक उल्टा संस्करण है जहां एक छिपे हुए चरित्र (U + 115F, U + 1160 या U + 3164) का उपयोग चर बनाने के लिए किया जाता है जो देखने में पसंद आते हैं 1, 2और 3

var  a = 1;
var 1 = a;
var 2 = a;
var 3 = a;
console.log( a ==ᅠ1 && a ==ᅠ2 && a ==ᅠ3 );

* उस उत्तर को शून्य चौड़ाई गैर-योजक (U + 200C) और शून्य चौड़ाई योजक (U + 200D) का उपयोग करके सरल बनाया जा सकता है। इन दोनों पात्रों को पहचानकर्ताओं के अंदर की अनुमति है लेकिन शुरुआत में नहीं:

var a = 1;
var a = 2;
var a = 3;
console.log(a == 1 && a == 2 && a == 3);

/****
var a = 1;
var a\u200c = 2;
var a\u200d = 3;
console.log(a == 1 && a\u200c == 2 && a\u200d == 3);
****/

अन्य तरकीबें एक ही विचार का उपयोग कर संभव हैं जैसे कि यूनिकोड भिन्न चयनकर्ताओं का उपयोग करके चर बनाने के लिए जो बिल्कुल एक जैसे दिखते हैं ( a︀ = 1; a︁ = 2; a︀ == 1 && a︁ == 2; // true)।


75

साक्षात्कार के नियम नंबर एक; कभी भी असंभव मत कहो।

छिपे चरित्र चालबाजी के लिए कोई ज़रूरत नहीं है।

window.__defineGetter__( 'a', function(){
    if( typeof i !== 'number' ){
        // define i in the global namespace so that it's not lost after this function runs
        i = 0;
    }
    return ++i;
});

if( a == 1 && a == 2 && a == 3 ){
    alert( 'Oh dear, what have we done?' );
}


6
आउच। __defineGetter__वास्तव में js भाषा का हिस्सा नहीं है, बस एक बदसूरत संस्करण है definePropertytypeofएक कार्य नहीं है और यह अघोषित iसिर्फ भयानक है। अभी भी 40 अपवोट के लायक लगता है: /
जोनास विलम्स

6
@JonasW। 41 upvotes :-) मुझे पता है कि __defineGetter__प्रति डेवलपर pmozilla.org/en-US/docs/Web/JavaScript/Reference/… पर प्रतिनियुक्त किया गया है, लेकिन यह स्पष्ट रूप से मेरे फायरफॉक्स v 57.0.4 में निष्पादित होता है, इसलिए इसे दिखाने के लिए चुना गया defineProperty()क्योंकि विरासत कोड वास्तविक है और इसे अनदेखा नहीं किया जा सकता है। कुरूपता के बावजूद, iमैंने जिस तरह से किया है, वह एक प्रसिद्ध / प्रलेखित व्यवहार है। शायद मैं सिर्फ एक पीसीजी मूड में था was \ _ (_) _ /
Monkey

68

ईमानदारी से, भले ही इसके लिए सही या सही मूल्यांकन करने का एक तरीका है या नहीं (और जैसा कि अन्य लोगों ने दिखाया है, कई तरीके हैं), मैं जिस उत्तर की तलाश कर रहा हूं, वह बोल रहा हूं, जिसने सैकड़ों साक्षात्कार आयोजित किए हैं, की तर्ज पर कुछ:

"ठीक है, शायद हाँ कुछ अजीब परिस्थितियों के सेट के तहत जो मेरे लिए तुरंत स्पष्ट नहीं हैं ... लेकिन अगर मुझे असली कोड में इसका सामना करना पड़ा, तो मैं सामान्य डिबगिंग तकनीकों का उपयोग करके पता लगाऊंगा कि यह कैसे और क्यों कर रहा था। और फिर उस स्थिति से बचने के लिए तुरंत कोड को रिफलेक्टर करें ... लेकिन इससे भी महत्वपूर्ण बात: मैं पूरी तरह से उस कोड को पहली जगह पर लिखना नहीं चाहूंगा क्योंकि यह जटिल कोड की बहुत ही परिभाषा है, और मैं कोशिश करता हूं कि कभी भी कोड न लिखे "।

मुझे लगता है कि कुछ साक्षात्कारकर्ता ऐसा करने के लिए अपराध करेंगे, जो स्पष्ट रूप से एक बहुत ही मुश्किल प्रश्न है, जिसे बाहर बुलाया गया है, लेकिन मुझे ऐसे डेवलपर्स से कोई मतलब नहीं है, जिनके पास एक राय है, खासकर जब वे इसे तर्कपूर्ण विचार के साथ वापस ले सकते हैं और मेरे प्रश्न को गलत कर सकते हैं खुद के बारे में एक सार्थक बयान।


13
यह सवाल (या सभी साक्षात्कार के प्रश्न) शायद एक समस्या के बारे में सोचने की इच्छा रखने वाले उम्मीदवारों का परीक्षण करना है, विशेष रूप से जो "स्पष्ट रूप से स्पष्ट" हैं, जैसे यह। कोई है जो सोचने से इनकार करता है क्योंकि वे मानते हैं कि वे "जानते हैं" जवाब एक अच्छा किराया नहीं है।
शम्मो

5
@ हैच नहीं, मैं उन्हें दंडित नहीं करूंगा यदि वे अच्छे विश्वास में जवाब देते हैं और विशेष रूप से यदि उन्होंने एक सही उत्तर दिया है जैसे कि दूसरों ने दिखाया है ... लेकिन मैं फिर कोशिश करूंगा कि क्या वे सोचते हैं और जांच करें कोड लिखने या न लिखने का अच्छा तरीका। जानकार होने के नाते और एक "सही" उत्तर के साथ आने में सक्षम होने के नाते एक अच्छा डेवलपर होने का केवल एक हिस्सा है। एक "पेशेवर" डेवलपर के लिए अधिक महत्वपूर्ण कोड लिखना है जो सड़क के नीचे समझ में आता है और बनाए रखने योग्य है, अक्सर कम सक्षम डेवलपर्स द्वारा। अत्यधिक चालाक डेवलपर्स IME अक्षम लोगों के रूप में बहुत खराब हैं।
फ्रैंक डब्ल्यू। ज़ामेट्टी

16
इस सवाल का जवाब नहीं है।
टाइलेरह

6
इस जवाब के बारे में दुखद बात यह है कि एक 1rep उपयोगकर्ता ने उत्तर दिया कि कल और 2 डाउनवोट मिले, जिससे वह इस प्रश्न को हटा देगा।
जोनास विलम्स

8
@ जॉन्कोलेमैन सवाल पूछता है कि कोड कैसे सही का मूल्यांकन कर सकता है। यह उन कारणों को नहीं पूछता है जो साक्षात्कारकर्ता ने पहली जगह में प्रश्न का प्रस्ताव किया था। यह उत्तर पूछे जाने वाले प्रश्न को हल करने का प्रयास भी नहीं करता है, और इसके बजाय साक्षात्कारकर्ता के उद्देश्य का अनुमान लगाने के प्रयास में पूरी तरह से "मैं क्या करूँगा" संस्करण पर केंद्रित है। अगर यह सवाल पूछा जाता, तो यह बहुत व्यापक होता। इसलिए यह उत्तर यहां या साइट पर कहीं भी नहीं है।
टायलरएच

43

यदि आपको कभी ऐसा साक्षात्कार प्रश्न मिलता है (या अपने कोड में कुछ समान रूप से अप्रत्याशित व्यवहार को नोटिस करें) तो सोचें कि किस तरह की चीजें संभवतः एक व्यवहार का कारण बन सकती हैं जो पहली नज़र में असंभव लगती है:

  1. एन्कोडिंग : इस मामले में आप जिस चर को देख रहे हैं वह वह नहीं है जो आप सोचते हैं कि यह है। ऐसा तब हो सकता है जब आप जानबूझकर एक दूसरे की तरह वैरिएबल लुक का नाम बनाने के लिए एकरूप या अंतरिक्ष वर्णों का उपयोग करके यूनिकोड के साथ खिलवाड़ करते हैं , लेकिन एन्कोडिंग मुद्दों को गलती से भी पेश किया जा सकता है, उदाहरण के लिए, जब यूनिकोड कोड को अनपेक्षित रूप से वेब से कोड कॉपी करना और चिपकाना होता है। अंक (उदाहरण के लिए क्योंकि एक सामग्री प्रबंधन प्रणाली ने कुछ "ऑटो-स्वरूपण" किया जैसे कि flयूनिकोड 'लेटिन SMALL LIGATURE FL' (U + FB02) के साथ प्रतिस्थापित किया गया)।

  2. दौड़ की स्थिति : एक दौड़ की स्थिति हो सकती है, अर्थात ऐसी स्थिति जहां कोड डेवलपर द्वारा अपेक्षित अनुक्रम में निष्पादित नहीं कर रहा है। बहु-थ्रेड कोड में रेस की स्थिति अक्सर होती है, लेकिन कई थ्रेड्स दौड़ की स्थिति के लिए संभव होने की आवश्यकता नहीं है - अतुल्यकालिकता पर्याप्त है (और भ्रमित न हों, async का मतलब यह नहीं है कि कई थ्रेड हुड के तहत उपयोग किए जाते हैं )।

    ध्यान दें कि जावास्क्रिप्ट भी दौड़ की स्थिति से मुक्त नहीं है क्योंकि यह एकल-पिरोया हुआ है। एक साधारण एकल-थ्रेडेड के लिए यहां देखें - लेकिन async - उदाहरण। एक भी बयान के संदर्भ में दौड़ की हालत हालांकि जावास्क्रिप्ट में हिट करने के लिए कठिन होगी।

    वेब कर्मचारियों के साथ जावास्क्रिप्ट थोड़ा अलग है, क्योंकि आपके पास कई धागे हो सकते हैं। @mehulmpt ने वेब कर्मियों का उपयोग करते हुए हमें एक बेहतरीन सबूत दिखाया है ।

  3. साइड-इफेक्ट्स : समानता तुलना ऑपरेशन का एक साइड-इफेक्ट (जो यहां के उदाहरणों में उतना स्पष्ट नहीं है, अक्सर साइड-इफेक्ट बहुत सूक्ष्म होते हैं)।

इस तरह के मुद्दे केवल जावास्क्रिप्ट ही नहीं, कई प्रोग्रामिंग भाषाओं में भी दिखाई दे सकते हैं, इसलिए हम यहां शास्त्रीय जावास्क्रिप्ट डब्ल्यूटीएफ 1 में से एक नहीं देख रहे हैं ।

बेशक, साक्षात्कार का प्रश्न और यहाँ के नमूने बहुत ही विवादित लगते हैं। लेकिन वे एक अच्छे अनुस्मारक हैं:

  • साइड-इफेक्ट्स वास्तव में बुरा हो सकता है और यह कि एक अच्छी तरह से डिज़ाइन किया गया प्रोग्राम अवांछित दुष्प्रभावों से मुक्त होना चाहिए।
  • मल्टी-थ्रेडिंग और म्यूटेबल स्थिति समस्याग्रस्त हो सकती है।
  • चरित्र एन्कोडिंग और स्ट्रिंग प्रोसेसिंग न करने से गंदा कीड़े हो सकते हैं।

1 उदाहरण के लिए, आप में एक पूरी तरह से अलग प्रोग्रामिंग भाषा (सी #) एक उदाहरण मिल सकता है एक पक्ष प्रभाव (एक स्पष्ट एक) का प्रदर्शन यहाँ


1
फिर, सवाल बहुत व्यापक हो जाता है। अलग-अलग भाषाएं इसे आसानी से अलग-अलग डिग्री के साथ लागू कर सकती हैं। प्रश्न को इतना कर्षण प्राप्त हुआ है क्योंकि यह एक जेएस विशिष्ट प्रश्नोत्तर है, लेकिन यह सिर्फ मेरा 2 सी है।
CS95

1
कारण भिन्न हैं C # और जावास्क्रिप्ट इसलिए यह उत्तर वैध नहीं है।
एडविन

3
@ ईडविन: कारण बिल्कुल समान हैं: यूनिकोड समान दिखने वाले ग्लिफ़ या स्पेस कैरेक्टर, रेस की स्थिति, या तुलनात्मक संचालन के साइड-इफेक्ट्स (बाद वाले मेरे उदाहरण में दिखाए जा रहे हैं) के साथ।
डिर्क वोल्मार

2
@ c @ser: कभी-कभी व्यापक कोण से चीजों को देखने से वास्तविक समस्या को देखने में मदद मिलती है।
डिर्क वोल्मार

3
काश यह उत्तर कुछ "मेटा" तरीके से इस प्रश्न को टैग किया जा सके। इसके ऊपर के सभी उत्तरों को पढ़ने के बाद, मुझे यह महसूस हो रहा था कि जेएस के पास बहुत सारे छेद हैं, लेकिन आपने सिर्फ एक ही बार में सभी उत्तरों को समेट दिया है। और आपने इसे इस तरह से किया है कि यह मेरी राय में एक तारकीय साक्षात्कार प्रश्न (यदि भाषा-विशिष्ट टैग हटा दिया गया है) बनाता है। वाहवाही!
केसीई

41

यहाँ एक और भिन्नता है, आप जो भी मान चाहते हैं उसे पॉप करने के लिए एक सरणी का उपयोग करके।

const a = {
  n: [3,2,1],
  toString: function () {
    return a.n.pop();
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Yes');
}


31

ठीक है, जनरेटर के साथ एक और हैक:

const value = function* () {
  let i = 0;
  while(true) yield ++i;
}();

Object.defineProperty(this, 'a', {
  get() {
    return value.next().value;
  }
});

if (a === 1 && a === 2 && a === 3) {
  console.log('yo!');
}


आप हैक कहते हैं, लेकिन मुझे पूरा यकीन है कि यह जनरेटर का उपयोग मामला है ... :) (ठीक है, सिवाय इसके कि यह thisविंडो ऑब्जेक्ट होने पर निर्भर करता है )
कोडी

29

प्रॉक्सी का उपयोग करना :

var a = new Proxy({ i: 0 }, {
    get: (target, name) => name === Symbol.toPrimitive ? () => ++target.i : target[name],
});
console.log(a == 1 && a == 2 && a == 3);

प्रॉक्सी मूल रूप से एक लक्ष्य ऑब्जेक्ट (पहला पैरामीटर) होने का दिखावा करता है, लेकिन लक्ष्य ऑब्जेक्ट पर ऑपरेशन को रोक देता है (इस मामले में "संपत्ति प्राप्त करें" ऑपरेशन) ताकि डिफ़ॉल्ट ऑब्जेक्ट व्यवहार के अलावा कुछ और करने का अवसर हो। इस मामले में "संपत्ति प्राप्त करें" कार्रवाई को उस aसमय कहा जाता है जब ==प्रत्येक प्रकार की तुलना करने के लिए इसके प्रकार को सुनिश्चित करता है। ऐसा होता है:

  1. हम एक लक्ष्य ऑब्जेक्ट बनाते हैं { i: 0 }, जहां iसंपत्ति हमारा काउंटर है
  2. हम लक्ष्य ऑब्जेक्ट के लिए एक प्रॉक्सी बनाते हैं और इसे असाइन करते हैं a
  3. प्रत्येक a ==तुलना के लिए, aएक प्रकार एक आदिम मूल्य के लिए मजबूर है
  4. इस प्रकार के ज़बरदस्ती से a[Symbol.toPrimitive]()आंतरिक रूप से कॉलिंग होती है
  5. प्रॉक्सी a[Symbol.toPrimitive]"हैंडलर प्राप्त करें" का उपयोग करके फ़ंक्शन को प्राप्त करना स्वीकार करता है
  6. प्रॉक्सी का "गेट हैंडलर" चेक करता है कि जो संपत्ति हासिल की जा रही है Symbol.toPrimitive, उस स्थिति में यह वृद्धि करता है और फिर लक्ष्य वस्तु से काउंटर लौटाता है ++target.i:। यदि एक अलग संपत्ति पुनर्प्राप्त की जा रही है, तो हम डिफ़ॉल्ट संपत्ति मान वापस करने के लिए वापस आते हैं,target[name]

इसलिए:

var a = ...; // a.valueOf == target.i == 0
a == 1 && // a == ++target.i == 1
a == 2 && // a == ++target.i == 2
a == 3    // a == ++target.i == 3

अधिकांश अन्य उत्तरों के साथ, यह केवल एक ढीली समानता की जांच ( ==) के साथ काम करता है , क्योंकि सख्त समानता की जांच ( ===) प्रकार का ज़बरदस्ती नहीं करती है ताकि प्रॉक्सी अवरोधन कर सके।


2
इस के लिए एक प्रॉक्सी का उपयोग करने का कोई मतलब नहीं है, हालांकि - Symbol.toPrimitiveकिसी वस्तु पर उसी तरह से परिभाषित करना भी काम करेगा।
Ry-

27

वास्तव में प्रश्न के पहले भाग का उत्तर प्रत्येक प्रोग्रामिंग भाषा में "हां" है। उदाहरण के लिए, यह C / C ++ के मामले में है:

#define a   (b++)
int b = 1;
if (a ==1 && a== 2 && a==3) {
    std::cout << "Yes, it's possible!" << std::endl;
} else {
    std::cout << "it's impossible!" << std::endl;
}

27
मुझे नहीं लगता कि यह हर प्रोग्रामिंग भाषा में संभव है । उदाहरण के लिए सभी भाषाओं में प्रीप्रोसेसर नहीं हैं। उस मामले के लिए, सभी भाषाएँ &&तार्किक "और" के लिए उपयोग नहीं होती हैं ।
कीथ थॉम्पसन

3
मुझे एक रास्ता मिला जो पायथन और सी ++ दोनों में काम करता है जो ऑपरेटर ओवरलोडिंग का उपयोग करता है।
डोनाल्ड डक

7
और आप इसे जावा में प्रतिबिंब का उपयोग करके और पूर्णांक कैश को गड़बड़ करके कर सकते हैं।
सीएडी 97

7
यह उस भाषा में नहीं कर सकता है जो उस स्थान पर उत्परिवर्तन का समर्थन नहीं करता है, उदाहरण के लिए हैस्केल में कुछ भी उपलब्ध नहीं है
जेसन कैर

4
सवाल जावास्क्रिप्ट के बारे में पूछ रहा है, सी ++ नहीं।
सभी कार्यकर्ता

26

एक ही, लेकिन अलग-अलग, लेकिन फिर भी एक ही (कई बार "परीक्षण किया जा सकता है"):

const a = { valueOf: () => this.n = (this.n || 0) % 3 + 1}
    
if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

मेरा विचार इस बात से शुरू हुआ कि संख्या वस्तु प्रकार समीकरण कैसे काम करता है।


4
दूसरी बार भी काम करता है!
सलमान ए

25

एक ECMAScript 6 उत्तर जो प्रतीकों का उपयोग करता है:

const a = {value: 1};
a[Symbol.toPrimitive] = function() { return this.value++ };
console.log((a == 1 && a == 2 && a == 3));

के कारण ==उपयोग, जावास्क्रिप्ट मजबूर करने के लिए माना जाता है aदूसरे संकार्य के लिए कुछ पास में ( 1, 2, 3इस मामले में)। लेकिन इससे पहले कि जावास्क्रिप्ट अपने दम पर जोर लगाने की कोशिश करता है, यह कॉल करने की कोशिश करता है Symbol.toPrimitive। यदि आप Symbol.toPrimitiveजावास्क्रिप्ट प्रदान करते हैं तो आपके फ़ंक्शन रिटर्न का उपयोग करेगा। यदि नहीं, तो जावास्क्रिप्ट कॉल करेगा valueOf


24

मुझे लगता है कि इसे लागू करने के लिए यह न्यूनतम कोड है:

i=0,a={valueOf:()=>++i}

if (a == 1 && a == 2 && a == 3) {
  console.log('Mind === Blown');
}

एक कस्टम के साथ एक डमी ऑब्जेक्ट बनाना जो प्रत्येक कॉल पर valueOfएक वैश्विक चर बढ़ाता है i। 23 अक्षर!


14

यह एक अच्छा साइड-इफ़ेक्ट के साथ डिफाइनोप्रॉर्टी का उपयोग करता है, जिसके कारण ग्लोबल वैरिएबल है!

var _a = 1

Object.defineProperty(this, "a", {
  "get": () => {
    return _a++;
  },
  configurable: true
});

console.log(a)
console.log(a)
console.log(a)


8
आप एक बंद का उपयोग कर सकते हैं a: get: (a => () => ++a)(0),कोई वैश्विक आवश्यक नहीं।
नीना शुल्ज़

13
@NinaScholz यकीन है, लेकिन हम यहाँ बुरी प्रथाओं के बारे में बात कर रहे हैं - बस मुझे यह करने दो: D
बेन ऑबिन

1

valueOfएक वर्ग घोषणा में ओवरराइड करके , यह किया जा सकता है:

class Thing {
    constructor() {
        this.value = 1;
    }

    valueOf() {
        return this.value++;
    }
}

const a = new Thing();

if(a == 1 && a == 2 && a == 3) {
    console.log(a);
}

क्या होता है कि valueOfप्रत्येक तुलना ऑपरेटर में कहा जाता है। पहले पर, aबराबर होगा 1, दूसरे पर, aबराबर होगा 2, और इसी तरह और आगे, क्योंकि हर बार valueOfकहा जाता है, का मूल्य बढ़ जाता aहै।

इसलिए कंसोल.लॉग आग और आउटपुट (मेरे टर्मिनल रास्ते में) Thing: { value: 4}, यह दर्शाता है कि सशर्त सच था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.