অ্যারে.প্রোটোটাইপ.মিনে অন্তর্ভুক্ত বনাম অ্যারে.প্রোটোটাইপ.ইন্ডেক্সঅফ


112

উন্নত পাঠযোগ্যতা ছাড়াও, বেশ কোনো সুবিধা includesবেশি indexOf? তারা আমার কাছে অভিন্ন বলে মনে হচ্ছে।

এই মধ্যে পার্থক্য কি

var x = [1,2,3].indexOf(1) > -1; //true

এবং এই?

var y = [1,2,3].includes(1); //true

12
includesঅনেক খারাপ ব্রাউজার সমর্থন আছে।
কোয়ান্টিন

4
নোট যেটি includesES6 / ES2015 এর অংশ নয়। এটি ECMAScript এর পরবর্তী সংস্করণের জন্য প্রস্তাব এবং এই বছর যুক্ত করা হবে।
ফেলিক্স ক্লিং

4
কেবল এটিও উল্লেখ করতে চেয়েছিলেন যে includesIE এ
মোটেই সমর্থনযোগ্য

উত্তর:


138

tl; dr: NaN আলাদাভাবে চিকিত্সা করা হয়:

  • [NaN].indexOf(NaN) > -1 হয় false
  • [NaN].includes(NaN) হয় true

প্রস্তাবনা থেকে :

প্রেরণা

ECMAScript অ্যারে ব্যবহার করার সময়, অ্যারেতে কোনও উপাদান অন্তর্ভুক্ত থাকে কিনা তা নির্ধারণ করার জন্য সাধারণত এটি পছন্দ করা হয়। এটির জন্য বিদ্যমান প্যাটার্নটি হ'ল

if (arr.indexOf(el) !== -1) {
    ...
}

অন্যান্য বিভিন্ন সম্ভাবনা সহ, যেমন arr.indexOf(el) >= 0, বা এমনকি ~arr.indexOf(el)

এই নিদর্শন দুটি সমস্যা প্রদর্শন:

  • তারা "আপনার অর্থ কি তা বলতে" ব্যর্থ হয়েছেন: অ্যারেতে কোনও উপাদান রয়েছে কিনা তা জিজ্ঞাসা করার পরিবর্তে আপনি অ্যারের মধ্যে সেই উপাদানটির প্রথম উপস্থিতির সূচকটি কী তা জিজ্ঞাসা করেন এবং তারপরে এটি তুলনা বা বিট-ট্যুইড নির্ধারণ করতে আপনার প্রকৃত প্রশ্নের উত্তর।
  • তারা এর জন্য ব্যর্থ হয় NaN, যেমন indexOfকঠোর সমতার তুলনা এবং এইভাবে ব্যবহার করে [NaN].indexOf(NaN) === -1

প্রস্তাবিত সমাধান

আমরা একটি Array.prototype.includesপদ্ধতির সংযোজন প্রস্তাব করি , যেমন উপরের নিদর্শনগুলি আবার লিখতে পারে

if (arr.includes(el)) {
    ...
}

এটিতে উপরের মত প্রায় শব্দার্থকতা রয়েছে, এটি স্ট্রেইট ইক্যুয়ালিটি তুলনার পরিবর্তে সামেভ্যালিউজিরো তুলনা অ্যালগরিদম ব্যবহার করে, [NaN].includes(NaN)সত্য করে তোলে ।

সুতরাং, এই প্রস্তাব বিদ্যমান কোডে দেখা উভয় সমস্যার সমাধান করে।

আমরা অতিরিক্ত একটি যোগ fromIndexপ্যারামিটার হয়, অনুরূপ Array.prototype.indexOfএবং String.prototype.includesদৃঢ়তা জন্য।


আরো তথ্য:


1
অর্ধেক সত্য। এছাড়াও পৃথক: নিখোঁজ উপাদানগুলি হিসাবে বিবেচিত undefinedহয় .includes()এবং বিবেচনা করা হয় না .indexOf()
রবার্ট সিমার

11

আপনি যদি পারফরম্যান্স সম্পর্কে অবাক হন, এই মুহুর্তের জন্য, সূচিপত্র দ্রুত, তবে এই জেএসপারফ পরীক্ষাটি দেখায় যে আরও বেশি সময় উত্তীর্ণ হবে, তার includes()চেয়ে আরও দ্রুত হবে indexOf(আমার ধারণা এটি আরও অনুকূলিত হবে)।

আইএমএইচও, আমি লিখতেও পছন্দ করি if (arr.includes(el)) {}কারণ এটি স্পষ্ট এবং এর চেয়ে বেশি রক্ষণাবেক্ষণযোগ্যif (arr.indexOf(el) !== -1) {}


1
পারফরম্যান্সের পার্থক্য যেমন সুস্পষ্ট নয় বলে মনে হয়। আমার মোবাইল ফায়ারফক্স দেখায় যে সূচিপত্রটি আসলে দ্রুততর। কিছু ক্রোম সংস্করণ একই কাজ করে ... তবে আজকের বাস্তবায়নে পার্থক্য যাইহোক নগণ্য বলে মনে হয়।
Nux

8

.indexOf()এবং .includes()পদ্ধতিগুলি অ্যারের উপাদানগুলির সন্ধান করতে বা প্রদত্ত স্ট্রিংয়ে একটি অক্ষর / সাবস্ট্রিং অনুসন্ধান করতে ব্যবহার করা যেতে পারে।

অ্যারে ব্যবহার

( ECMAScript নির্দিষ্টকরণের লিঙ্ক )

  1. indexOfব্যবহার যথাযথ সমতা তুলনা যেহেতু includesব্যবহারসমূহ SameValueZero অ্যালগরিদম। এই কারণে, নিম্নলিখিত দুটি পয়েন্টের মধ্যে পার্থক্য দেখা দেয়।

  2. ফেলিক্স ক্লিং দ্বারা চিহ্নিত হিসাবে , আচরণ ক্ষেত্রে ক্ষেত্রে ভিন্ন NaN

let arr = [NaN];

arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
  1. ক্ষেত্রে আচরণও আলাদা undefined
let arr = [ , , ];

arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true

স্ট্রিং ব্যবহার

( ECMAScript নির্দিষ্টকরণের লিঙ্ক )

  1. আপনি যদি কোনও রেজিপেক্স পাস করেন তবে indexOfএটি RegExp কে একটি স্ট্রিং হিসাবে বিবেচনা করবে এবং যদি পাওয়া যায় তবে স্ট্রিংয়ের সূচি ফিরিয়ে দেয়। তবে, আপনি যদি একটি রেজিপ্স পাস করেন তবে includesএটি একটি ব্যতিক্রম ছুঁড়ে দেবে।
let str = "javascript";

str.indexOf(/\w/); // returns -1 even though the elements match the regex because /\w/ is treated as string
str.includes(/\w/); // throws TypeError: First argument to String.prototype.includes must not be a regular expression

কর্মক্ষমতা

যেমন 538 আরএমইও উল্লেখ করেছে, includesএটি সামান্য (খুব ক্ষুদ্র) কিছুটা ধীর হতে পারে (কারণ এটি প্রথম যুক্তি হিসাবে একটি রেজেক্সের জন্য পরীক্ষা করা প্রয়োজন) indexOfতবে বাস্তবে, এটি খুব বেশি পার্থক্য রাখে না এবং উপেক্ষিতও হয়।

ইতিহাস

String.prototype.includes()ECMAScript 2015 Array.prototype.includes()সালে চালু হয়েছিল যেখানে ECMAScript 2016 সালে চালু হয়েছিল browser ব্রাউজার সমর্থনের ক্ষেত্রে, তাদের বুদ্ধিমানের সাথে ব্যবহার করুন।

String.prototype.indexOf()এবং Array.prototype.indexOf()ECMAScript এর ES5 সংস্করণে উপস্থিত রয়েছে এবং তাই সমস্ত ব্রাউজার দ্বারা সমর্থিত।


indexOftrueস্পষ্টভাবে undefinedঅ্যারেতে সেট করার পরে দেয় : let arr=[undefined];বা let arr=[];arr[0]=undefined;এখনarr.indexOf(undefined) === 0
জয় দধনিয়া

আপনি শুধুমাত্র এক সঙ্গে পার্থক্য নির্দেশ করে হয় undefinedকারণ হল: .includesযেমন উপাদান অনুপস্থিত একইরূপে undefinedসময় .indexOf()উপেক্ষা তাদের। আপনি অনুপস্থিত উপাদানগুলির সাথে "তৈরি" করতে পারেন arr[number beyond length] = whatever
রবার্ট সিমার

কেউ স্ট্রিং চাইছিল না, তবে আপনার মন্তব্যগুলি .includes()কেবল স্ট্রিং খায়। বাস্তবে উভয় পদ্ধতিই কোনও স্ট্রিংয়ের মতো যথাসাধ্য বাধ্য করে। Regex বিশেষভাবে করার যুক্তি হিসেবে অন্তর্ভুক্ত করা হয় না .includes()করতে মান ভবিষ্যৎ সংযোজন জন্য অনুমতি বর্তমান খসড়া অনুযায়ী।
রবার্ট সিমার

4

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


0

indexOf()এবং includes()উভয়ই একটি অ্যারেতে উপাদানগুলি খুঁজতে ব্যবহার করা যেতে পারে তবে প্রতিটি ফাংশন বিভিন্ন ফেরতের মান দেয়।

indexOfএকটি সংখ্যা প্রদান করে ( -1যদি উপাদান অ্যারেতে উপস্থিত না হয়, বা উপাদান উপস্থিত থাকলে অ্যারের অবস্থান)।

includes()একটি বুলিয়ান মান ( trueবা false) প্রদান করে।


হাই ক্রুটি, এই প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে এবং এর একটি স্বীকৃত উত্তর রয়েছে। তদ্ব্যতীত, আপনি দেখতে পাবেন যে কীভাবে আপনার উত্তরটিতে ইতিমধ্যে অন্যান্য উত্তরে ইতিমধ্যে বলা তথ্য রয়েছে। প্রশ্নটি, শেষ অবধি ইতিমধ্যে 4 বছরের পুরানো। দয়া করে নতুন প্রশ্ন বা উত্তরহীন প্রশ্নের জন্য দিকনির্দেশ দিন। আপনাকে ধন্যবাদ
লিওনার্ডফ্যাক্টরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.