অবজেক্ট.আইএস বনাম ===


141

আমি একটি কোড উদাহরণে হোঁচট খেয়েছি যা এই তুলনাটি ব্যবহার করছিল:

var someVar = 0;
Object.is(false, someVar); //Returns false 

আমি জানি false == 0হবে trueকেন আমরা আছে এর ===

এর Object.isথেকে আলাদা কীভাবে ===?

উত্তর:


174

===জাভাস্ক্রিপ্টে কড়া তুলনা অপারেটর বলা হয়। Object.isএবং কঠোর তুলনা অপারেটর NaNএবং বাদে ঠিক একই আচরণ করে +0/-0

এমডিএন থেকে:

Object.is()===অপারেটর অনুযায়ী পদ্ধতিটি সমান হওয়ার মতো নয় । ===অপারেটর (এবং ==পাশাপাশি অপারেটর) সংখ্যা মান -0 এবং +0 সমান এবং একইরূপে একইরূপে Number.NaNযেমন সমান নয় NaN

নীচের কোডটি ===এবং এর মধ্যে পার্থক্য তুলে ধরে Object.is()

console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true

console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true

console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true

এখানে চিত্র বর্ণনা লিখুন

আপনি এখানে আরও উদাহরণ পেতে পারেন ।

দ্রষ্টব্য : Object.isECMAScript 6 প্রস্তাবনার অংশ এবং এটি এখনও ব্যাপকভাবে সমর্থিত নয় (যেমন এটি ইন্টারনেট এক্সপ্লোরারের কোনও সংস্করণ বা অন্যান্য ব্রাউজারগুলির অনেক পুরানো সংস্করণ দ্বারা সমর্থিত নয়)। তবে আপনি নন-ইএস 6 ব্রাউজারগুলির জন্য একটি পলিফিল ব্যবহার করতে পারেন যা উপরের লিঙ্কটিতে পাওয়া যাবে।


26
উত্তরের প্রথম লাইনটি হতে হবে "NaN এবং +0 এবং -0 ব্যতীত তারা ঠিক একই রকম আচরণ করে" সম্ভবত।
বেনিয়ামিন গ্রুইনবাউম

1
@ বেনজামিন গ্রুয়েনবাউম ভাল পরামর্শ। উত্তর পড়তে সহজ করে তোলে। চিয়ার্স।
গুরপ্রীত সিং 8

3
@ বিনম্র.আম্বেলে এটি দৈর্ঘ্যে আলোচনা করা হয়েছিল - স্থির পদ্ধতিগুলি সহজ - তাদের প্রসঙ্গ বিষয় বা আদিম সমস্যা নেই। উদাহরণস্বরূপ আপনার উদাহরণের জন্য আমি মিথ্যা আশা করছিলাম তবে জেএস-এর সাথে নতুনদের সত্য প্রত্যাশা হবে যেহেতু .xস্ট্রিং বক্সগুলিতে এটি কোনও Stringবস্তুতে পরিণত করা হয়েছে (এবং স্ট্রিং আদিম মান নয়) এবং তুলনাটি কোনও অবজেক্ট এবং একটি স্ট্রিংয়ের মধ্যে হবে - এটি খুব সূক্ষ্ম এবং একটি অসুবিধা - স্ট্যাটিকস এই সমস্যাগুলি এড়ায়, স্থির পদ্ধতিগুলি সহজ এবং ব্যবহার সহজ।
বেনিয়ামিন গ্রুইনবাউম

2
@ humble.rumble DOM নোডের সাথে তুলনা করার জন্য, ইতিমধ্যে একটি পদ্ধতি আছে, দেখুন একুয়ালনোড । উদাহরণ:document.createElement('div').isEqualNode(document.createElement('div')) === true
রব ডব্লিউ

2
2017 আপডেট: অবজেক্ট.ইস () এখন সমস্ত বড় ব্রাউজারে ব্যাপকভাবে সমর্থিত।
স্টার্লিং বোর্ন

56

Object.isস্পেসিফিকেশনের সেমভ্যালিউ অ্যালগোরিদম=== ব্যবহার করে , যেখানে স্ট্রাইক ইক্যুয়ালিটি অ্যালগরিদম ব্যবহার করে । স্ট্রাইক ইক্যুয়ালিটি অ্যালগোরিদমের একটি নোট এই পার্থক্যটিকে ডেকেছে:

স্বাক্ষরিত শূন্য এবং ন্যানের চিকিত্সার ক্ষেত্রে এই অ্যালগরিদম সেমভ্যালু অ্যালগরিদম থেকে আলাদা ...

মনে রাখবেন যে:

  • NaN === NaNমিথ্যা, তবে Object.is(NaN, NaN)সত্য
  • +0 === -0সত্য, তবে Object.is(+0, -0)মিথ্যা
  • -0 === +0সত্য, তবে Object.is(-0, +0)মিথ্যা

জাভাস্ক্রিপ্টটিতে কমপক্ষে চার ধরণের "সমতা" রয়েছে:

  • "আলগা" ( ==), যেখানে অপারেশনগুলি তাদের ম্যাচ করার জন্য প্ররোচিত হবে। বিধিগুলি স্পষ্টভাবে নির্দিষ্ট , তবে স্পষ্ট নয়। ( "" == 0হয় true; "true" == trueহয় false, ...)।
  • "কঠোর" ( ===), যেখানে বিভিন্ন ধরণের অপারেশনগুলি জোর করা হবে না (এবং সমান হবে না) তবে উপরে নোট NaNএবং ইতিবাচক এবং নেতিবাচক শূন্য দেখুন see
  • সেমভ্যালু - উপরে তালিকাভুক্ত হিসাবে (দ্বারা ব্যবহৃত Object.is)
  • SameValueZero - মত SameValueব্যতীত +0এবং -0একই পরিবর্তে ভিন্ন (দ্বারা ব্যবহৃত Mapকী-জন্য, এবং দ্বারা Array.prototype.includes)।

এর রয়েছে বস্তুর সমানতা , যা ভাষা দ্বারা উপলব্ধ বা রানটাইম নয় নিজেই, কিন্তু সাধারণত প্রকাশ পায় বস্তু একই প্রোটোটাইপ, একই বৈশিষ্ট্য আছে, এবং তাদের সম্পত্তি মান একই (এর "একই" কিছু যুক্তিসঙ্গত সংজ্ঞা দ্বারা হয় )।


সেমভ্যালু অ্যালগোরিদম :

  • যদি টাইপ (এক্স) প্রকার (y) থেকে পৃথক হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
  • টাইপ (x) যদি সংখ্যা হয় তবে
    • X যদি NaN হয় এবং y হয় NaN হয় তবে সত্য আসুন।
    • যদি x +0 হয় এবং y -0 হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
    • যদি x -0 হয় এবং y +0 হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
    • X যদি y এর সমান সংখ্যার মান হয় তবে সত্যটি প্রত্যাবর্তন করুন।
    • মিথ্যা প্রত্যাবর্তন।
  • সেমভ্যালিউননম্বার (x, y) রিটার্ন করুন।

... যেখানে সেমভ্যালুঅন নাম্বার রয়েছে:

  • দৃsert়তা: প্রকার (এক্স) সংখ্যা নয়।
  • দৃsert়তা: টাইপ (এক্স) টাইপ (y) এর সমান।
  • প্রকার (x) যদি অপরিজ্ঞাত হয় তবে সত্যটি প্রত্যাবর্তন করুন।
  • যদি টাইপ (x) নাল হয় তবে সত্যটি প্রত্যাবর্তন করুন।
  • যদি টাইপ (এক্স) স্ট্রিং হয় তবে
    • যদি x এবং y কোড ইউনিটের একই ক্রম হয় (একই সূচীতে একই দৈর্ঘ্য এবং একই কোড ইউনিট), সত্য ফিরে আসুন; অন্যথায়, মিথ্যা ফিরে।
  • টাইপ (এক্স) যদি বুলিয়ান হয় তবে
    • যদি x এবং y উভয়ই সত্য হয় বা উভয়ই মিথ্যা হয় তবে সত্য আসুন; অন্যথায়, মিথ্যা ফিরে।
  • টাইপ (এক্স) যদি প্রতীক হয় তবে
    • যদি x এবং y উভয়ই একই প্রতীক মান হয় তবে সত্য আসুন; অন্যথায়, মিথ্যা ফিরে।
  • যদি x এবং y একই বস্তুর মান হয় তবে সত্যটি প্রত্যাবর্তন করুন। অন্যথায়, মিথ্যা ফিরে।

কঠোর সমতা অ্যালগোরিদম :

  1. যদি টাইপ (এক্স) প্রকার (y) থেকে পৃথক হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
  2. টাইপ (x) যদি সংখ্যা হয় তবে
    • যদি এক্স NaN হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
    • যদি YNN হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
    • X যদি y এর সমান সংখ্যার মান হয় তবে সত্যটি প্রত্যাবর্তন করুন।
    • যদি x +0 হয় এবং y -0 হয় তবে সত্য আসুন।
    • যদি x--এবং y হয় +0 হয় তবে সত্য আসুন।
    • মিথ্যা প্রত্যাবর্তন।
  3. সেমভ্যালিউননম্বার (x, y) রিটার্ন করুন।

2

Object.is = function(v1, v2){
  //test for `-0`
  if(v1 === 0 && v2 === 0) {
    return 1 / v1 === 1 / v2;
  }
  
  //test for `NaN`
  if(v1 !== v1) {
    return v2 !== v2;
  }
  
  //everything else
  return v1 === v2;
}

উপরে Object.isআগ্রহী যে কেউ জানতে আগ্রহী তাদের জন্য কীভাবে কাজ করে তা দেখানোর জন্য উপরের পলিফিল ফাংশন । আপনাকে -জানা-জেএস-এর একটি উল্লেখ


2

সারসংক্ষেপ:

Object.is()ফাংশন আর্গুমেন্ট হিসাবে 2 মান নেয় এবং ফেরৎ সত্য যদি 2 দেওয়া মান সঠিক একই হয়, অন্যথায় এটি মিথ্যা ফিরে আসবে।

আমাদের কেন এটা দরকার?

আপনি ভাবতে পারেন, ===অপারেটরের সাথে জাভাস্ক্রিপ্টে আমাদের ইতিমধ্যে কঠোর সমতা (চেক টাইপ + মান) পরীক্ষা করা আছে , কেন আমাদের এই ফাংশনটির প্রয়োজন? ভাল কঠোর সাম্যতা কিছু ক্ষেত্রে যথেষ্ট নয় এবং সেগুলি নিম্নলিখিত:

console.log(NaN === NaN);   // false
console.log(-0 === +0);     // true

Object.is() এই মানগুলির তুলনা করতে সক্ষম হয়ে আমাদের দেখতে সহায়তা করে যে সেগুলি অনুরূপ কিনা, কঠোর সাম্য অপারেটর কিছু করতে পারে না।

console.log(Object.is(NaN, NaN));  // true
console.log(Object.is(-0, 0));     // false
console.log(Object.is(+0, +0));    // true
console.log(Object.is(+0, -0));    // false


0

সংক্ষেপে, তারা অনুরূপ, তবে Object.isস্মার্ট এবং আরও নির্ভুল ...

আসুন এটি দেখুন ...

+0 === -0 //true

তবে এটি পুরোপুরি ঠিক নয় কারণ এটি উপেক্ষা করে -এবং এর +আগে ...

এখন আমরা ব্যবহার:

Object.is(+0, -0) //false

আপনি দেখতে হিসাবে, এটি তুলনা আরও সঠিক।

NaNযে ক্ষেত্রে আরও সঠিক মত কাজ করে, হিসাবে NaNএকই বিবেচনা ।

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