(A == 1 && a == 2 && a == 3) কখনও কি সত্যের মূল্যায়ন করতে পারে?


2483

মডারেটর দ্রষ্টব্য: দয়া করে কোডটি সম্পাদনা করার বা এই বিজ্ঞপ্তিটি সরিয়ে নেওয়ার তাগিদ প্রতিরোধ করুন। হোয়াইটস্পেসের প্যাটার্নটি এই প্রশ্নের অংশ হতে পারে এবং তাই অহেতুক কোনওভাবে হস্তক্ষেপ করা উচিত নয়। আপনি যদি "সাদা স্থান তুচ্ছ" শিবিরে থাকেন তবে আপনার কোডটি যেমন হয় তেমন গ্রহণ করতে সক্ষম হওয়া উচিত।

এটি কি কখনও সম্ভব যা জাভাস্ক্রিপ্টে (a== 1 && a ==2 && a==3)মূল্যায়ন করতে পারে true?

এটি একটি বড় প্রযুক্তি সংস্থা জিজ্ঞাসা করা একটি সাক্ষাত্কারের প্রশ্ন। এটি দুই সপ্তাহ আগে ঘটেছিল, তবে আমি এখনও উত্তরটি সন্ধান করার চেষ্টা করছি। আমি জানি আমরা আমাদের প্রতিদিনের কাজের ক্ষেত্রে এই জাতীয় কোডটি কখনই লিখি না, তবে আমি কৌতূহলী।


9
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
প্রতারণা করুন

109
যে লোকেরা আপাতদৃষ্টিতে এটিকে খুব বিস্তৃত হিসাবে ক্লোইয়ের পক্ষে ভোট দিয়েছে তাদের কাছে : জাভাস্ক্রিপ্টের একটি খনন এটি বলে যে এখানে অনেকগুলি বৈধ উত্তর রয়েছে?
16-15

24
কিছু লোক কী সম্ভব তা নিয়ে দার্শনিকতার চারপাশে বসে আছেন। অন্যরা তাদের ক্লায়েন্টদের জন্য টেকসই, ব্যবসায়ের সঠিক পণ্য তৈরি করছে কিনা সে বিষয়ে তাদের প্রচেষ্টা ফোকাস করে। আইএমও, এই প্রশ্নের কোনও বাস্তব উপযোগিতা নেই যে আপনার কোনও সাক্ষাত্কারে এই ধরণের প্রশ্ন জিজ্ঞাসা করা বা এই জাতীয় কোডটি কখনই লেখা উচিত নয়। এ কারণেই এটি বন্ধ করা উচিত। আমার অর্থ সত্যই, ব্যবসায়টি কি বুঝতে পারে যে তারা এই স্টাফটির বিষয়ে বসে কথা বলার জন্য কাউকে আসল অর্থ দিয়েছে?
পি.ব্রে.আর.ম্যাকি

15
উত্তরগুলি পড়ার পরে, গল্পটির নৈতিকতাগুলি হ'ল: ==আপনি যখন বোঝাতে চাইছেন তখন ব্যবহার করবেন না ===, একটি কোডিং মান রয়েছে যা নন-এএসসিআইআই ভেরিয়েবল নামগুলিতে নিষিদ্ধ করে এবং একটি লিটিং প্রক্রিয়া রয়েছে যা পূর্ববর্তী দুটি নৈতিকতা প্রয়োগ করে।
জেসি সি। স্লাইসার

87
মডারেটর দ্রষ্টব্য: স্ট্যাক ওভারফ্লো প্রশ্নবিদ্ধ ব্যক্তির কাছে বিভিন্ন ভাষায় উত্তর দিয়ে লোকেরা চিমন করছে history এই হয় প্রশ্নের উত্তর দিতে, কারণ তারা সাধারণ সমস্যা সমাধান হয়, একটি ভিন্ন ভাষা যদিও প্রচেষ্টা করা হয়েছে। তাদের "উত্তর নয়" হিসাবে পতাকাঙ্কিত করা থেকে বিরত থাকুন। এই কথাটি বলার পরে, দয়া করে বিভিন্ন ভাষায় আরও উত্তর পোস্ট করা থেকেও বিরত থাকুন - এই প্রশ্নটি জাভাস্ক্রিপ্টের সাথে সুনির্দিষ্ট হওয়ার কারণ রয়েছে, যেমন এই উত্তরগুলির কয়েকটিতে মন্তব্য দ্বারা চিহ্নিত করা হয়েছে, এবং আমাদের ভাষা-নির্দিষ্ট প্রশ্নগুলি পছন্দ করার কারণ রয়েছে তাই থেকে।
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তবে ইঞ্জিন তারপরে স্ট্রিংটিকে কোনও সংখ্যায় রূপান্তরিত করার চেষ্টা করত তবে আমাদের একই পরিণতি দেয়, যদিও কিছুটা দীর্ঘ পথ দিয়ে with


70
ইম্প্লিড valueOf()অপারেশন পরিবর্তন করে আপনি কি এটি অর্জন করতে পারবেন ?
স্টার্লিং আর্চার 20

43
হ্যাঁ, ভ্যালুওফ একই কারণে টু স্ট্রিংয়ের জায়গায় কাজ করে
কেভিন বি

4
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
প্রতারণা করুন

13
মতে এই একটি নম্বর রূপান্তর প্রথম চেষ্টা করা হবে যাতে valueOfসামান্য ভাল।
সালমান এ

6
@ পিওফেরেরেট সাম্যের তুলনার বাম দিকের দিকটি একটি বস্তু, কোনও সংখ্যা নয়। যে অবজেক্টটির একাধিক সম্পত্তি রয়েছে iতা ইঞ্জিনকে বিরক্ত করে না। ;)
16:08

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
অবশ্যই, এটি স্ট্যান্ডার্ড লুফোল হিসাবে নিষিদ্ধ , যা সাক্ষাত্কারগুলিতেও প্রযোজ্য। [উদ্ধৃতি আবশ্যক]
সানাইচাইস

13
আসল ব্যবধান বিবেচনা করে এটি আরও খারাপ হতে পারে, অর্থাত একটি ভেরিয়েবল var ᅠ2 = 3ব্যবহার করা হয়েছে; সুতরাং তিনটি ভেরিয়েবল রয়েছে aᅠᅠ= 1, ᅠ2 = 3, a = 3( a␣ = 1, ␣2 = 3, a = 3তাই, তাই (a␣==1 && a==␣2 && a==3))…
হোলার

2
@ আ-জামি দুটি ভেরিয়েবলের একটি অতিরিক্ত চরিত্র রয়েছে যা আপনার স্ক্রিনে একটি স্থান হিসাবে দেখায়, তবে এটি শনাক্তকারীর অংশ হিসাবে ব্যাখ্যা করা হয়েছে, যার অর্থ তিনটি পৃথক ভেরিয়েবল রয়েছে - ক, ক এবং ক - অতিরিক্ত চরিত্রটি হ'ল হাঙ্গুলের অর্ধ-প্রস্থের স্থান।
জেফ

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অনুমতি নেই।
jفر00

6
গৃহীত উত্তরের উত্তর পয়েন্টে তারা এ জাতীয় কিছু না করে withযাতে এটি ঘটতে পারে
জংকুক

2
@jorrit কেউ ব্যবহার করেন ==। এবং ===গৃহীত উত্তরকে বাধা দেয়
জোনাস উইলস

4
@JonasW। এখনও প্রচুর লোক ব্যবহার করে ==তবে আমি আর দেখতে withপাইনি ... আসলে জেএস ডকুমেন্টেশনের বাইরে কখনও বলা হয়নি যেখানে "দয়া করে এটি ব্যবহার করবেন না" বলা আছে। যাইহোক, একটি দুর্দান্ত সমাধান।
ওয়ার্টওয়ার্ট

516

Getters বা মান ছাড়া উদাহরণ:

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

এটি কাজ করে কারণ ==আহ্বান করে toStringযা .joinঅ্যারেগুলিকে কল করে ।

আর একটি সমাধান, 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
সত্যিই আমি মনে করি এটি সেরা উত্তর। এটি সাধারণের বাইরে কিছুই জড়িত না, কেবল কয়েকটি মান নির্ধারণ করে। এমনকি বেসিক জেএস জ্ঞান থাকা সত্ত্বেও খুব সহজে বোঝা যায়। সাবাশ.
জ্যাক ডেলভেন্টাল

14
এটি প্রায় দরকারী এটি বোধ করে তোলে।
অ্যান্ড্রু

7
আমি জানতাম বেশিরভাগ উত্তরগুলি গালি দেওয়া সম্পর্কে হবে toStringবা valueOfতবে এটি আমাকে পুরোপুরি নজরদারির বাইরে ফেলেছে। খুব চালাক এবং আমি জানতাম না যে এটি .joinঅভ্যন্তরীণভাবে কল করেছে , তবে এটি পুরোপুরি অর্থপূর্ণ।
জিবিরোসো

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
অন্যান্য সমাধানগুলি জানা থাকলেও আমি ইচ্ছাকৃতভাবে এই উত্তরটি দেব, কারণ এটি প্রশ্নের উত্তর দেয় তবে তারা পরবর্তীকালে কী ছিল তা স্পষ্টতই নয়। বোকা গেম খেলুন, বোকা পুরষ্কার জিতুন।
ESR

2
তবে যদি এটি 1000 টিরও বেশি ট্রায়াল নেয়?
পিয়িন

9
@ পিয়িন যদি এটি 1000 টিরও বেশি ট্রায়াল নেয় তবে আপনি একটি পুরস্কার জিতবেন!
স্কেয়েট

5
আমি এই উত্তরটি পছন্দ করি কারণ এটি চূড়ান্ত দিকে নিয়ে যাওয়া থেকে বোঝা যায় যে প্রোগ্রামটি চলাকালীন সিপিইউ-এর রেজিস্টার / ক্যাশে পর্যাপ্ত মহাজাগতিক রশ্মিতে আঘাত হানে বা যদি ইচ্ছাকৃতভাবে কোনও পাওয়ার গ্লিট করে তবে এর ব্যর্থতা শাখাটি কোনও ভাষায়ই এটি সম্ভব this কন্ডিশনাল আসলে লাফ দেয় না।
পঙ্কডুডল

সর্বনিম্ন: 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
@ আবদিল্লাহ একটি রেজেক্স অবজেক্টটি তার সাথে মিলিত শেষ সূচকটি মনে রাখবে, 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স্থানীয় ভেরিয়েবল (যা দেখতে এটির মতো দেখা যায়), তবে এটি কাজ করবে না।
jفر00

1
@ jfriend00 আপনি বোঝাতে চাইছেন যদি আপনি ভার; কোথাও?
jontro

হ্যাঁ। রেফারেন্সিং থেকে a == 1বোঝা যায় aকোথাও একটি পরিবর্তনশীল, এর সম্পত্তি নয় this। গ্লোবালের মতো অদ্ভুত জায়গা রয়েছে যেখানে উভয়ই সত্য হতে পারে, সাধারণত, এর সাথে একটি ভেরিয়েবল ঘোষণা করে var aবা এর let aঅর্থ এমন কোনও thisকিছুই নেই যা aআপনাকে কোড হিসাবে ধরে নিয়েছে এমন কোনও সম্পত্তি হিসাবে অ্যাক্সেস করতে দেয় । সুতরাং, আপনার কোডটি দৃশ্যত কিছু অদ্ভুত গ্লোবাল পরিবর্তনশীল জিনিসটি ধরে নিচ্ছে। উদাহরণস্বরূপ, আপনার কোড নোড.জেজে কাজ করে না এবং কোনও ফাংশনের অভ্যন্তরে কঠোর মোডে নয়। এটি কোথায় কাজ করে তা আপনার সঠিক পরিস্থিতি নির্দিষ্ট করতে হবে এবং সম্ভবত এটি কেন কাজ করে তা ব্যাখ্যা করতে হবে। অন্যথায়, এটি বিভ্রান্তিকর।
jender00

@ jender00 ভাল নিশ্চিত নিশ্চিত নয় যে এটি ইতিমধ্যে অন্যান্য উত্তরের সাথে আরও অনেক বেশি মান যুক্ত করবে। উত্তরটি আপডেট করবে
jontro

14
প্রশ্ন ছিল, এই "কখনও" সত্য হতে পারে? এবং উত্তর হ্যাঁ, এবং এটি এমন এক দৃশ্যের যেখানে এটি সত্য হতে পারে: aকোনও স্থানীয় পরিবর্তনশীল নয় এবং এটি একটি বাড়ানো গিটারের সাথে বৈশ্বিক সুযোগে সংজ্ঞায়িত।
জ্যাক ডেলভেন্থল

190

ভেরিয়েবলের aদ্বারা অ্যাক্সেস পাওয়ার ক্ষেত্রে এটি সম্ভব , একটি শ্যারডআরারি বাফারের মাধ্যমে কিছু মূল স্ক্রিপ্টের মাধ্যমে 2 ওয়েব কর্মী বলুন। সম্ভাবনা কম, কিন্তু এটা সম্ভব যে যখন কোড মেশিন কোডে কম্পাইল করা হয়, ওয়েব শ্রমিকদের পরিবর্তনশীল আপডেট 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
কেবল তা-ই নয় - আমি সত্যিকারের বিশ্বে এটি ঘটতে দেখেছি। প্রশ্নের সঠিক অবস্থার সাথে নয়, তবে অবশ্যই কোনও ফাংশন শুরুর সময় (a == 1) এবং (a == 2) পরে ফাংশনটিতে যাচাই করা এবং কোড থাকা উভয় শর্তের সাথে রয়েছে hit এফওয়াইআই, প্রথমবার যখন আমি এটি ঘটতে দেখেছিলাম তা একটি গাড়ি ইঞ্জিন নিয়ামক ছিল এবং আমরা কোডিংয়ের মানটি রেখেছি। দ্বিতীয়বার ছিল সামরিক বিমানের জন্য একটি তুষল এবং উদ্দীপনা জালানো সিস্টেমে, এবং সংস্থায় আমার প্রথম দিনেই আমি এটি খুঁজে পেয়েছি এবং এটি ঠিক করেছি, যখন দলের বাকী অংশগুলি এখনও সমস্যাটি নিয়ে আলোচনা করছিল। (কুদোস স্তর: উচ্চ! :)
গ্রাহাম

38
সুতরাং, আপনি "গাড়ি ইঞ্জিন নিয়ন্ত্রক" এবং ওয়েবের সাথে জাভাস্ক্রিপ্টে প্রোগ্রাম হওয়া "শ্যাফ এবং ফ্লেয়ার ডিসপেন্সার সিস্টেমগুলি" নিয়ে কাজ করেছেন? আমি মনে করি না যে আমি আবার বাইরে যাব।
psaxton

12
@ স্প্যাক্সটন :) অবশ্যই তা নয় - তবে আমাদের ভাগ করা ডেটা সহ মাল্টি-থ্রেডেড সফ্টওয়্যার রয়েছে। এটি সমস্ত মাল্টি-থ্রেডেড সফ্টওয়্যারগুলির জন্য একটি অ্যান্টি-প্যাটার্ন, যা জাভাস্ক্রিপ্ট বা ওয়েব কর্মীদের জন্য সুনির্দিষ্ট নয়। আপনি সমাবেশের ভাষা, ব্রেনফ * সি কে, ভিজ্যুয়াল বেসিক, সি বা জাভাস্ক্রিপ্টে প্রোগ্রাম করছেন কিনা তা বিবেচ্য নয় - আপনি যদি একাধিক-থ্রেড অ্যাপ্লিকেশনটিতে ভাগ করা ডেটা দিয়ে এটি করেন তবে সর্বদা ব্যর্থ হবে।
গ্রাহাম

4
আমি মনে করি এটি এখন @ জোন্ট্রোর জবাবের চারপাশে একটি বিস্তৃত মোড়ক।
কিএনটিএম

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তীরের ক্রিয়াকলাপের শরীরে অভ্যন্তরীণ বৈশ্বিক বস্তু হওয়ার উপর নির্ভর করে ।
রায় টিঙ্কার

@ মিডনাইটাস আমি অন্য কোনও উত্তর "পিরামিড কোড" হিসাবে শ্রেণীবদ্ধ করব না ।
প্যাট্রিক রবার্টস

নোট করুন এটিও স্বেচ্ছাসেবী আদেশের সাথে কাজ করে, তাই না? লাইক (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!');
}

সম্পাদনা

ES6 ক্লাস ব্যবহার করে এটি দেখতে এটির মতো লাগবে

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সুতরাং যখন আমরা মানটির তুলনা করি এটি আসলে বৃদ্ধি পায় ..
ড্যানিয়েল স্যান্ডিলো

130

আমি ইতিমধ্যে পোস্ট করা উত্তরটি দেখতে পাচ্ছি না, তাই আমি এই উত্তরটিও মিশ্রণে ফেলে দেব। এটি অর্ধ-প্রস্থের হাঙ্গুল স্পেসের সাথে জেফের উত্তরের অনুরূপ ।

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

আপনি দ্বিতীয়টির সাথে সামান্য তাত্পর্য লক্ষ্য করতে পারেন, তবে প্রথম এবং তৃতীয়টি নগ্ন চোখের মতো ident সমস্ত 3 স্বতন্ত্র অক্ষর:

a- ল্যাটিন লোয়ার কেস এ
- সম্পূর্ণ প্রস্থ ল্যাটিন লোয়ার কেস এ
а- সিরিলিক লোয়ার কেস এ

এর জন্য জেনেরিক শব্দটি "হোমোগ্লিফস": বিভিন্ন ইউনিকোড অক্ষর যা দেখতে একই রকম। সাধারণত তিনটি পাওয়া একেবারে পৃথক পৃথক, তবে কিছু ক্ষেত্রে আপনি ভাগ্যবান হতে পারেন। এ, Α, А এবং Ꭺ ভাল কাজ করবে (ল্যাটিন এ, গ্রিক আলফা , সিরিলিক-এ , এবং চেরোকি-এ ; যথাক্রমে দুর্ভাগ্যবশত গ্রিক ও চেরোকি ছোট হাতের অক্ষর ল্যাটিন থেকে খুব ভিন্ন a: α, , এবং তাই ফেলে না উপরের স্নিপেটের সাহায্য করবে না)।

সেখানে হোমোগ্লিফ অ্যাটাকগুলির একটি সম্পূর্ণ শ্রেণি রয়েছে, বেশিরভাগই নকল ডোমেন নামগুলিতে (যেমন wikipediа.org) (সিরিলিক) বনাম wikipedia.org(লাতিন))) থাকে তবে এটি কোডেও প্রদর্শিত হতে পারে; সাধারণত আন্ডারহ্যান্ডড হিসাবে উল্লেখ করা হয় (যেমনটি একটি মন্তব্যে উল্লিখিত হয়েছে, [আন্ডারহ্যান্ডেড] প্রশ্নগুলি এখন পিপিসি -তে অফ-টপিক , তবে এক ধরণের চ্যালেঞ্জ হিসাবে ব্যবহৃত হত যেখানে এই ধরণের জিনিস প্রদর্শিত হবে)। এই উত্তরটির জন্য ব্যবহৃত হোমোগ্লিফগুলি খুঁজে পেতে আমি এই ওয়েবসাইটটি ব্যবহার করেছি ।


19
"সামান্য তাত্পর্য " এটি আমি কীভাবে বলব তা নয়।

4
@hvd সম্পূর্ণরূপে আপনার ফন্ট রেন্ডারিংয়ের উপর নির্ভর করে। এটাই আমি দেখছি
ড্রাকো

1
@ জ্যাক হ্যাঁ, পূর্ণ প্রস্থের লাতিন লোয়ার কে এ সর্বাধিক হোমোগ্লিফ নয় (তবে মূলধন-বর্ণের রূপগুলি আশ্চর্যজনক)। সাধারণত আপনার পছন্দসই প্রভাবটি পেতে দু'জনের প্রয়োজন।
ড্রাকো

@ ড্রাকো 18 এর সাথে সম্মত পুনরায়: সাধারণত মাত্র 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>")
}

উপরের কোডটি একটি সংক্ষিপ্ত সংস্করণ (মন্তব্যগুলিতে তার নোটের জন্য @ ফোরফিনকে ধন্যবাদ) এবং নিম্নলিখিত কোডটি মূল:

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, তবে এটি আপনার ক্ষেত্রে কাজ করে!


» সে #

এছাড়াও আমি একটি সি # সংস্করণ লিখেছি ( সম্পত্তির মূল্য বৃদ্ধি প্রযুক্তি সহ ):

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
জাভাস্ক্রিপ্ট সংস্করণ মানবতার বিরুদ্ধে সত্যিকারের অপরাধ এবং এটি করার ক্ষমতা, ইউএন-কনভেনশনগুলির দ্বারা অবৈধ হওয়া উচিত be আমি মনে করি এটি প্রায় সময়ই আমরা জাভাক্রিপ্টের সমস্ত জ্ঞানের জগতকে শুদ্ধ করি।
ক্লিয়ারার

2
ফাংশন ঘোষণা এমনকি সংক্ষিপ্ত হতে পারে। if‌=()=>!0
ফোরভিভিন

4
পৃথিবীতে আপনি কেন ব্যবহার করলেন document.write? উত্তরের বাকী অংশ বিবেচনা না করেই নিয়োগ না নেওয়ার একটি নিশ্চিত উপায়।
সার্বারুস

3
@ সেরবরাস, আপনার নোটের জন্য আপনাকে ধন্যবাদ। আমি প্রথমে আমার উত্তরটি দিয়ে লিখেছিলাম console.logতবে আমি এটিকে ডকুমেন্ট.রাইটে পরিবর্তন করেছি। সত্যই সর্বদা আমি console.logআমার কোডগুলিতে ব্যবহার করি তবে এখানে আমি কেবল স্ট্যাকওভারফ্লো কোড স্নিপেট বক্সের ব্যবহারকারীদের কাছে একটি পাঠ্য প্রদর্শন করতে চাই। তাই আমি আমার বার্তাটি উত্পন্ন বার্তার চেয়ে আরও সুন্দর প্রদর্শন করতে চেয়েছিলাম console.log। ক্লিক করুন Run Code Snippetআমার উত্তর এবং অন্যান্য উত্তরের উপর বোতাম। এসও কোড স্নিপেট আমাকে এইচটিএমএল এবং জেএস এবং সিএসএস ব্যবহার করতে দেয় তবে আমি আমার উত্তরে এটি ব্যবহার করতে এবং এটি সুন্দর করে তুলতে চাই। আমি মনে করি এটির কোনও নেতিবাচক পার্শ্ব প্রতিক্রিয়া নেই এবং আমার উত্তরটি বড় বা সংকলিত করে নি।
র‌্যাম

1
@ ক্লেয়ার, যদি ইউএন-কনভেনশনগুলি কার্যকরভাবে বিশ্বকে পরিবর্তন করতে পারে তবে আমাদের চেয়ে আরও ভাল একটি বিশ্ব হওয়া উচিত। আমাদের ইউএন-তে বিবৃতি দেওয়ার চেয়েও বেশি কিছু দরকার এবং সেদিন পর্যন্ত আমি মনে করি যে আমরা আমার এই জাভাস্ক্রিপ্ট ট্রিকটি ব্যবহার করতে পারি;)
র‌্যাম

97

জাভাস্ক্রিপ্ট

a == a +1

জাভাস্ক্রিপ্টে, কোনও পূর্ণসংখ্যা ছাড়া কেবলমাত্র 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
@ ক্যাশ: জাভা, জাভাস্ক্রিপ্ট, পোটায়েটো, পোটাহ্টো :) ইতিমধ্যে যথেষ্ট ভাল জেএস উত্তর রয়েছে। আমি কেবল ভেবেছিলাম এটি অন্যান্য ভাষায় কীভাবে করা যায় তা দেখানো আকর্ষণীয় হবে এবং সম্ভবত জেএস বিকাশকারীদের কিছু ধারণা দেয়।
এরিক ডুমিনিল

2
@ কেস: জেএস উদাহরণ সহ আপডেট হয়েছে।
এরিক ডুমিনিল

1
জাভা সংস্করণটি কেন কাজ করে না Integer a = 42(বা এটি করে)? আমি যেমন অটোবক্সিং বোঝে, Integer a = 42; a == 1 && a == 2 && a == 3সমস্ত ইনসটি বাক্স করা উচিত। বা এই তুলনা আনবক্স একটি?
CAD97

@ CAD97: আনবক্সিংয়ের Integer == intফলাফল বলে মনে হচ্ছে। তবে Integer#equals(int)ফোর্স অটোবক্সিং ব্যবহার করে, তাই এটি কাজ করে। মন্তব্যের জন্য ধন্যবাদ!
এরিক ডুমিনিল

@ স্টাফেনবিজিটার: দয়া করে ব্যাখ্যা করুন। আমি যতদূর জানি, কেবল Numbersজেএসে রয়েছে, যা মূলত doubleএস এর মতো । এগুলি পূর্ণসংখ্যার মতো দেখতে পারে এবং আপনি এগুলি পূর্ণসংখ্যার মতো ব্যবহার করতে পারেন তবে তারা এখনও পূর্ণসংখ্যক নয়। n == n + 1জাভা / পাইথন / সি / রুবি / ... এর পূর্ণসংখ্যার জন্য কখনও সত্য হতে পারে বলে আমি মনে করি না
এরিক ডুমিনিল

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 );

* এই উত্তরটি শূন্য প্রস্থের নন-জয়েন্টার (ইউ + 200 সি) এবং শূন্য প্রস্থের সংযুক্তকারী (ইউ + 200 ডি) ব্যবহার করে সহজ করা যেতে পারে। এই দুটি অক্ষরই শনাক্তকারীদের ভিতরে অনুমোদিত তবে শুরুতে নয়:

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__আসলে জেএস ভাষার অংশ নয়, এর একটি কদর্য সংস্করণ definePropertytypeofকোনও ফাংশন নয় এবং এই অঘোষিতটি iকেবল ভয়াবহ। এখনও 40 টি upvotes এর মূল্য বলে মনে হচ্ছে: /
জোনাস

6
@JonasW। 41 upvotes :-) আমি সচেতন যে am __defineGetter__প্রতি অবচিত developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... কিন্তু এটা পরিষ্কারভাবে আমার ফায়ারফক্স বনাম 57.0.4 মধ্যে executes তাই আমি পরিবর্তে এই দেখানোর জন্য নির্বাচিত defineProperty()কারণ লিগ্যাসি কোডটি আসল এবং এড়ানো যায় না। কদর্যতা নির্বিশেষে, iআমি যেভাবে করেছি তা ঘোষণা করা একটি সুপরিচিত / নথিভুক্ত আচরণ। সম্ভবত আমি কেবল পিসিজি মুডে ছিলাম ¯ \ _ (ツ) _ / ¯
MonkeyZeus

68

সত্যই যদিও, সত্যের কাছে মূল্যায়নের কোনও উপায় আছে কিনা (এবং অন্যরা যেমন দেখিয়েছে, একাধিক উপায় রয়েছে), আমি যে উত্তরটির সন্ধান করতে চাইছি, শত শত সাক্ষাত্কার গ্রহণ করেছেন এমন একজন হিসাবে কথা বলছেন, তা হ'ল লাইন বরাবর কিছু:

"হ্যাঁ, হ্যাঁ কিছু অদ্ভুত পরিস্থিতিতে এমন পরিস্থিতি রয়েছে যা আমার কাছে তাত্ক্ষণিকভাবে স্পষ্ট নয় ... তবে যদি আমি সত্যিকারের কোডে এর মুখোমুখি হই তবে আমি সাধারণ ডিবাগিং কৌশলগুলি ব্যবহার করব কীভাবে এবং কেন এটি করছে যা করছে তা নির্ধারণ করার জন্য এবং তারপরে তাত্ক্ষণিকভাবে এ পরিস্থিতি এড়ানোর জন্য কোডটি রিফ্যাক্টর ... তবে আরও গুরুত্বপূর্ণ: আমি অবশ্যই প্রথমে সেই কোডটি লিখব না কারণ এটি সংশ্লেষিত কোডের খুব সংজ্ঞা, এবং আমি কখনই সংশ্লেষিত কোড না লেখার চেষ্টা করি "।

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


13
প্রশ্নটি (বা সমস্ত সাক্ষাত্কারের প্রশ্নগুলি) সম্ভবত প্রার্থীদের কোনও সমস্যা নিয়ে ভাবতে ইচ্ছুকতার পরীক্ষা করার জন্য, বিশেষত এটির মতো "আপাতদৃষ্টিতে সুস্পষ্ট"। যে কেউ ভাবতে অস্বীকার করেছেন কারণ তারা বিশ্বাস করে যে উত্তরটি তারা "জানেন" ভাল ভাড়াটি নয়।
শাম্মু

5
@ ডন হ্যাচ নো, তারা যদি ভাল বিশ্বাসের সাথে জবাব দেয় এবং বিশেষত যদি তারা অন্যদের দেখানো মত সঠিক উত্তর দেয় তবে আমি তাদের শাস্তি দেব না ... তবে আমি তাদের অনুসরণ করার চেষ্টা করব এবং তারা মনে করে কিনা তদন্ত করার জন্য একটি ফলোআপ চাইব কোড লেখার জন্য একটি ভাল উপায় বা না। জ্ঞানবান হওয়া এবং একটি "সঠিক" উত্তর নিয়ে আসতে সক্ষম হওয়া একজন ভাল বিকাশকারী হওয়ার অংশ is একজন "পেশাদার" বিকাশকারীটির পক্ষে আরও গুরুত্বপূর্ণ এমন কোড লেখা যা বোঝা যায় এবং রাস্তাটি রক্ষণাবেক্ষণযোগ্য হয়, প্রায়শই কম সক্ষম বিকাশকারীরা। অতিরিক্ত চতুর বিকাশকারীরা অক্ষম আইএমইয়ের মতোই খারাপ bad
ফ্র্যাঙ্ক ডব্লিউ জামেট্টি

16
এটি প্রশ্নের উত্তর দেয় না।
টাইলারহান

6
এই উত্তরটির জন্য দুঃখজনক বিষয়টি হ'ল একজন 1 জন ব্যবহারকারী ব্যবহারকারী গতকাল এর উত্তর দিয়েছিলেন এবং 2 টি ডাউনভোট পেয়েছিলেন যা তাকে এই প্রশ্নটি মুছে ফেলছে।
জোনাস উইলস

8
@ জনকোলম্যান প্রশ্নটি জিজ্ঞাসা করে যে কোডটি কীভাবে সত্যে মূল্যায়ন করতে পারে। এটি সাক্ষাত্কারকারীর প্রথম স্থানে প্রশ্নটির কারণগুলির কারণ জিজ্ঞাসা করে না। এই উত্তরটি জিজ্ঞাসা করা প্রশ্নটি সমাধান করার চেষ্টাও করে না, এবং পরিবর্তে সাক্ষাত্কারের উদ্দেশ্য কী তা অনুমান করার প্রয়াসের একটি সংস্করণ "আমি কী করব" পুরোপুরি নিবদ্ধ করে। যদি সেই প্রশ্নটি জিজ্ঞাসা করা হত তবে এটি খুব বিস্তৃত হবে। সুতরাং এই উত্তরটি এখানে বা সাইটের কোথাও অন্তর্ভুক্ত নয়।
টাইলার

43

আপনি যদি কখনও এই জাতীয় সাক্ষাত্কারের প্রশ্ন পান (বা আপনার কোডে কিছুটা সমানভাবে অপ্রত্যাশিত আচরণ লক্ষ্য করেছেন) কী ধরণের জিনিস সম্ভবত এমন আচরণের কারণ হতে পারে যা প্রথম নজরে অসম্ভব বলে মনে হয়:

  1. এনকোডিং : এই ক্ষেত্রে আপনি যে ভেরিয়েবলটির দিকে তাকিয়ে রয়েছেন তা আপনার মনে হয় এটি নয়। আপনি যদি ইচ্ছাকৃতভাবে ইউনিকোডের সাথে হোমোগ্লিফ বা স্পেস ক্যারেক্টার ব্যবহার করে ভেরিয়েবলের নামটিকে অন্যের মতো দেখতে এলোমেলো করে ফেলেন তবে এনকোডিংয়ের সমস্যাগুলিও ঘটনাক্রমে প্রবর্তন করা যেতে পারে, যেমন অনাকাঙ্ক্ষিত ইউনিকোড কোডযুক্ত ওয়েব থেকে কোড অনুলিপি করা ও পাস করার সময় পয়েন্টগুলি (উদাহরণস্বরূপ, কারণ কোনও বিষয়বস্তু পরিচালন ব্যবস্থার কিছু "অটো-ফর্ম্যাটিং" যেমন flইউনিকোডের 'ল্যাটিন স্মার্ট লিগ্যচার এফএল' (ইউ + এফবি02)) প্রতিস্থাপনের মতো করে ।

  2. রেসের শর্তসমূহ : একটি রেস-শর্ত হতে পারে, অর্থাত্ এমন একটি পরিস্থিতি যেখানে কোডটি বিকাশকারী দ্বারা প্রত্যাশিত ক্রম অনুসারে কার্যকর হয় না। রেস শর্তগুলি প্রায়শই মাল্টি-থ্রেড কোডগুলিতে ঘটে থাকে তবে রেস শর্তগুলি সম্ভব হওয়ার জন্য একাধিক থ্রেড প্রয়োজন হয় না - অ্যাসিনক্রোনসিটি যথেষ্ট (এবং বিভ্রান্ত হবেন না , অ্যাসিঙ্কের অর্থ এই নয় যে একাধিক থ্রেড হুডের নীচে ব্যবহৃত হয় )।

    মনে রাখবেন যে জাভা স্ক্রিপ্ট কেবলমাত্র একক থ্রেডড থাকার কারণে রেস শর্ত থেকে মুক্ত নয়। সাধারণ একক থ্রেডযুক্ত - তবে অ্যাসিঙ্ক - উদাহরণের জন্য এখানে দেখুন । একক বিবৃতি প্রসঙ্গে জাতির শর্তটি জাভাস্ক্রিপ্টে আঘাত করা বরং শক্ত হবে।

    ওয়েব কর্মীদের সাথে জাভাস্ক্রিপ্ট কিছুটা আলাদা, কারণ আপনার একাধিক থ্রেড থাকতে পারে। @ মেলাম্পটি ওয়েব কর্মীদের ব্যবহার করে আমাদের দুর্দান্ত প্রমাণের ধারণাটি দেখিয়েছে ।

  3. পার্শ্ব-প্রতিক্রিয়া : সমতা তুলনা অপারেশনের একটি পার্শ্ব-প্রতিক্রিয়া (যা এখানে উদাহরণ হিসাবে যেমন স্পষ্ট হতে হবে না, প্রায়শই পার্শ্ব প্রতিক্রিয়া খুব সূক্ষ্ম হয়)।

এই ধরণের সমস্যাগুলি কেবল জাভাস্ক্রিপ্ট নয়, অনেকগুলি প্রোগ্রামিং ভাষায় প্রকাশিত হতে পারে, সুতরাং আমরা এখানে 1 টি ধ্রুপদী জাভাস্ক্রিপ্ট ডাব্লুটিএফ দেখতে পাচ্ছি না ।

অবশ্যই, এখানে সাক্ষাত্কারের প্রশ্ন এবং নমুনাগুলি সমস্ত দেখতে খুব স্বীকৃত। তবে তারা একটি ভাল অনুস্মারক যে:

  • পার্শ্ব প্রতিক্রিয়াগুলি সত্যিই বাজে পেতে পারে এবং এটি একটি ভাল-ডিজাইন করা প্রোগ্রামটি অযাচিত পার্শ্ব প্রতিক্রিয়া থেকে মুক্ত হওয়া উচিত।
  • একাধিক থ্রেডিং এবং পরিবর্তনীয় অবস্থা সমস্যাযুক্ত হতে পারে।
  • অক্ষর এনকোডিং এবং স্ট্রিং প্রসেসিং ডান না করা দুষ্টু বাগগুলি হতে পারে।

1 উদাহরণস্বরূপ, যদি আপনি একটি সম্পূর্ণ ভিন্ন প্রোগ্রামিং ভাষা (গ #) একটি উদাহরণ জানতে পারেন একটি পার্শ্ব প্রতিক্রিয়া (একটি সুস্পষ্ট একটি) প্রদর্শক এখানে


1
তারপরে, প্রশ্নটি খুব প্রশস্ত হয়ে যায়। বিভিন্ন ভাষা স্বাচ্ছন্দ্যের বিভিন্ন ডিগ্রি সহ এটিকে বাস্তবায়ন করতে পারে। প্রশ্নটি এতটা আকর্ষণ পেয়েছে কারণ এটি একটি জেএস নির্দিষ্ট প্রশ্নোত্তর, তবে এটি কেবল আমার 2 সি।
cs95

1
কারণগুলি ভিন্ন সি # এবং জাভাস্ক্রিপ্ট তাই এই উত্তরটি বৈধ নয়।
এডউইন

3
@ এডউইন: কারণগুলি হুবহু: একই রকম দেখতে গ্লাইফ বা স্পেস অক্ষর, বর্ণের পরিস্থিতি, বা তুলনামূলক ক্রিয়াকলাপের পার্শ্ব-প্রতিক্রিয়াগুলির সাথে ইউনিকোড ফিডিং (আমার উদাহরণটিতে দ্বিতীয়টি দেখানো হচ্ছে)।
ডার্ক ভোলমার

2
@ কেস: কখনও কখনও বিস্তৃত কোণ থেকে জিনিসগুলি তাকানো প্রকৃত সমস্যাটি দেখতে সহায়তা করে।
ডার্ক ভোলমার

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এটি উইন্ডো অবজেক্ট হওয়ার উপর নির্ভর করে )
কোডি G

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কোনও জিনিসে একইভাবে সংজ্ঞা দেওয়া ঠিক একইভাবে কাজ করবে।
রাই-

27

আসলে প্রশ্নের প্রথম অংশের উত্তর হ'ল প্রতিটি প্রোগ্রামিং ভাষায় "হ্যাঁ"। উদাহরণস্বরূপ, এটি সি / সি ++ এর ক্ষেত্রে:

#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
আমি মনে করি না এটি প্রতিটি প্রোগ্রামিং ভাষায় সম্ভব possible উদাহরণস্বরূপ, সমস্ত ভাষার প্রিপ্রোসেসর নেই। এই বিষয়ে, সমস্ত ভাষা &&যৌক্তিক "এবং" ব্যবহার করে না ।
কিথ থমসন

3
আমি পাইথন এবং সি ++ উভয় ক্ষেত্রেই এমন একটি উপায় পেয়েছি যা অপারেটর ওভারলোডিং ব্যবহার করে।
ডোনাল্ড ডাক

7
এবং আপনি জাভাতে এটি প্রতিবিম্ব ব্যবহার করে এবং পূর্ণসংখ্যার ক্যাশে গণ্ডগোলের মাধ্যমে করতে পারেন।
CAD97

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
@ নিনা শোল্জ নিশ্চিত, তবে আমরা এখানে খারাপ অভ্যাসের বিষয়ে কথা বলছি - কেবল আমাকে
বেন আউবিন

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}, শর্তযুক্ত সত্য ছিল তা নির্দেশ করে indic

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