টাইপফ এবং উদাহরণের মধ্যে পার্থক্য কী এবং কখন একটির তুলনায় অন্যটি ব্যবহার করা উচিত?


394

আমার বিশেষ ক্ষেত্রে:

callback instanceof Function

অথবা

typeof callback == "function"

এটা কি তাত্পর্যপূর্ণ, পার্থক্য কি?

অতিরিক্ত সংস্থান:

জাভাস্ক্রিপ্ট-গার্ডেন typeof বনাম instanceof


2
সমাধানের সহজ সমাধান হিসাবে আমি আমার উত্তরটি এখানে পেয়েছি
CrandellWS


1
শুধু ব্যবহার .constructorপরিবর্তে সম্পত্তি।
মুহাম্মদ উমর

আপনার সম্পর্কে ভাবছি যদি কর্মক্ষমতা , আমার দেখতে নিচের উত্তরটাইপফফ দ্রুত হয় যেখানে উভয়ই প্রযোজ্য (যথা বস্তু)।
মার্টিন পিটার

উত্তর:


540

instanceofকাস্টম ধরণের জন্য ব্যবহার করুন :

var ClassFirst = function () {};
var ClassSecond = function () {};
var instance = new ClassFirst();
typeof instance; // object
typeof instance == 'ClassFirst'; // false
instance instanceof Object; // true
instance instanceof ClassFirst; // true
instance instanceof ClassSecond; // false 

typeofসাধারণ অন্তর্নির্মিত জন্য ব্যবহার করুন :

'example string' instanceof String; // false
typeof 'example string' == 'string'; // true

'example string' instanceof Object; // false
typeof 'example string' == 'object'; // false

true instanceof Boolean; // false
typeof true == 'boolean'; // true

99.99 instanceof Number; // false
typeof 99.99 == 'number'; // true

function() {} instanceof Function; // true
typeof function() {} == 'function'; // true

ব্যবহার করুন instanceofধরনের সালে নির্মিত জটিল জন্য:

/regularexpression/ instanceof RegExp; // true
typeof /regularexpression/; // object

[] instanceof Array; // true
typeof []; //object

{} instanceof Object; // true
typeof {}; // object

এবং শেষটি কিছুটা জটিল:

typeof null; // object

11
এই উত্তরটি পরিষ্কার করে দেয় যে কেন ইনস্ট্যাসফটি আদিম ধরণের জন্য ব্যবহার করা উচিত নয় । এটি কাস্টম ধরণের ক্ষেত্রে যেমন আপনার কাছে বিকল্প থাকে না তেমনি 'অবজেক্ট' ধরণের সুবিধার জন্যও এটি খুব স্পষ্ট। তবে কী "সাধারণ অন্তর্নির্মিত প্রকার" দিয়ে ফাংশনগুলিকে লম্পট করে তোলে? কোনও ফাংশন কীভাবে কোনও অবজেক্টের মতো আচরণ করে তা আমি অদ্ভুত বলে মনে করি, তবুও এটি টাইপটি 'ফাংশন' যা 'টাইপফ' ব্যবহারকে ব্যবহারযোগ্য করে তোলে। আপনি কেন এটির জন্য উদাহরণস্বরূপ নিরুৎসাহিত করবেন?
Assimilater

4
@ অ্যাসিম্লিমেন্ট আপনি ফাংশনগুলির সাথে উদাহরণস্বরূপ ব্যবহার করতে পারেন তবে আমি এই 3 টি নিয়মকে মনে রাখা খুব সহজ বলে মনে করি এবং হ্যাঁ, ফাংশনগুলি একটি ব্যতিক্রম :)
সাইমন ওয়াগনাস্কি

2
আর একটি জটিল অংশ -> স্ট্রিংয়ের উদাহরণ 'স্ট্রিং'; // মিথ্যা তবে নতুন স্ট্রিং ('উদাহরণস্বরূপ') স্ট্রিং; // সত্য
লুক

2
@ নতুন "স্ট্রিং" এর মতো ব্যবহার করা সাধারণভাবে খারাপ ধারণা। এটি স্ট্রিং আদিমের চেয়ে "স্ট্রিং অবজেক্ট" তৈরি করে। এখানে বিভাগটি দেখুন বিকাশকারী.মোজিলা.আর.ইন-
কলিন ডি

4
Use instanceof for complex built in types- এটি এখনও ত্রুটিযুক্ত। ES5 Array.isArray()ইত্যাদি ব্যবহার করা আরও ভাল । বা প্রস্তাবিত shims।
অরেঞ্জডোগ

122

উভয়ই কার্যক্ষমতায় একই কারণ তারা উভয়ই প্রকারের তথ্য ফেরত দেয় তবে আমি ব্যক্তিগতভাবে পছন্দ করি instanceofকারণ এটি স্ট্রিংয়ের পরিবর্তে প্রকৃত ধরণের তুলনা করে। প্রকারের তুলনাটি মানুষের ত্রুটির পক্ষে কম থাকে এবং এটি প্রযুক্তিগতভাবে দ্রুত হয় কারণ এটি পুরো স্ট্রিংয়ের তুলনা না করে স্মৃতিতে পয়েন্টারগুলির তুলনা করে।


8
কিছু পরিস্থিতি রয়েছে যেখানে উদাহরণটি প্রত্যাশার মতো কাজ করবে না এবং
টাইপটি

55
উদাহরণস্বরূপ একই উইন্ডোতে অবজেক্টের সাথে কাজ করে। আপনি যদি আইফ্রেমে / ফ্রেম বা পপআপ-উইন্ডো ব্যবহার করেন তবে প্রতিটি (i) ফ্রেম / উইন্ডোটির নিজস্ব "ফাংশন" অবজেক্ট রয়েছে এবং উদাহরণস্বরূপ ব্যর্থ হবে যদি আপনি অন্য (i) ফ্রেম / উইন্ডো থেকে কোনও বস্তুর তুলনা করার চেষ্টা করেন। typof সমস্ত ক্ষেত্রে কাজ করবে যেহেতু এটি "ফাংশন" স্ট্রিংটি ফিরিয়ে দেয়।
কিছু

14
jsperf.com/typeof-function-vs-instanceof/3 আমি ক্রোম এবং এফএফ 3. এক্স এ চেষ্টা করেছি, "টাইপফ" পদ্ধতিটি দ্রুত।
মরগান চেং

10
এটা ঠিক মিথ্যা। তারা অভিন্ন নয়। তারা উভয় একই পরিস্থিতি বিশেষত বিভিন্ন জাভাস্ক্রিপ্ট ভিএম এবং ব্রাউজার জুড়ে কাজ করে না।
জাস্টিন ফোর্স

8
আপনার উত্তর বলছে "কার্যকারিতার দিক থেকে উভয়ই মূলত অভিন্ন" " সম্মানজনকভাবে, এটি স্পষ্টতই মিথ্যা। আমার উত্তরে বর্ণিত ও বর্ণিত হিসাবে, কোনও বিকল্পই প্রতিটি পরিস্থিতিতে বিশেষত ব্রাউজারগুলিতে কাজ করে না। একটি সাথে দুটি ব্যবহার করা আরও ভাল পন্থা অপারেটর.
জাস্টিন ফোর্স

103

টাইপফোন ব্যবহারের একটি ভাল কারণ যদি ভেরিয়েবল অপরিজ্ঞাত হয়।

alert(typeof undefinedVariable); // alerts the string "undefined"
alert(undefinedVariable instanceof Object); // throws an exception

উদাহরণস্বরূপ ব্যবহার করার একটি ভাল কারণ হ'ল যদি ভেরিয়েবলটি শূন্য থাকে।

var myNullVar = null;
alert(typeof myNullVar ); // alerts the string "object"
alert(myNullVar  instanceof Object); // alerts "false"

সুতরাং সত্যিই আমার মতে এটি নির্ভর করে আপনি কোন ধরণের সম্ভাব্য ডেটা পরীক্ষা করছেন।


11
+1 এও নোট করে যে instanceofআদিম ধরণের সাথে টাইপফুলের সাথে তুলনা করতে পারে না।
টিনো

3
ক্রোম 29.0.1541.0 এ দেব undefined instanceof Objectমিথ্যা প্রত্যাবর্তন করে এবং একটি ব্যতিক্রম ছুঁড়ে না। পরিবর্তনটি কতটা সাম্প্রতিক তা আমি জানি না, তবে এটি instanceofআরও আকর্ষণীয় করে তোলে ।
সাইপ্রেস ফ্রাঙ্কেনফিল্ড

7
undefined instanceof Objectএকটি ব্যতিক্রম ছুঁড়ে না কারণ, আহ, undefinedসংজ্ঞায়িত হয়। নাম স্থানে ধ্রুবক বিদ্যমান exists যখন কোনও ভেরিয়েবলের অস্তিত্ব থাকে না (উদাহরণস্বরূপ টাইপের কারণে), উদাহরণস্বরূপ একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে। অপর-বিদ্যমান ভেরিয়েবলের অন্য ধরণের 'অপরিজ্ঞাপিত' প্রকারে টাইপফ ব্যবহার করা।
ক্লিওং করুন

31

বিষয়গুলি পরিষ্কার করার জন্য আপনার দুটি বিষয় জানতে হবে:

  1. Instanceof কিনা অপারেটর পরীক্ষার প্রোটোটাইপ সম্পত্তি একটি এর কন্সট্রাকটর যে কোন জায়গায় প্রদর্শিত হবে এগুলির নমুনা চেইন একটি বস্তুর। বেশিরভাগ ক্ষেত্রে এর অর্থ এই যে এই অবজেক্টটি এই কনস্ট্রাক্টর ব্যবহার করে বা এর বংশধরের দ্বারা তৈরি করা হয়েছিল । তবে প্রোটোটাইপটি Object.setPrototypeOf()পদ্ধতি দ্বারা (ECMAScript 2015) বা __proto__সম্পত্তি দ্বারা (পুরানো ব্রাউজারগুলি, অবমূল্যায়ন) দ্বারা স্পষ্টত সেট করা যেতে পারে । পারফরম্যান্স সমস্যার কারণে কোনও অবজেক্টের প্রোটোটাইপ পরিবর্তন করার পরামর্শ দেওয়া হয় না।

সুতরাং উদাহরণস্বরূপ শুধুমাত্র বস্তুর জন্য প্রযোজ্য। বেশিরভাগ ক্ষেত্রে আপনি স্ট্রিং বা সংখ্যা তৈরি করতে কনস্ট্রাক্টর ব্যবহার করছেন না। আপনি পারেন। কিন্তু আপনি প্রায় কখনও না।

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

আরেকটি সমস্যা হ'ল বিভিন্ন স্কোপে বিভিন্ন প্রয়োগের পরিবেশ থাকে। এর অর্থ হ'ল তাদের আলাদা বিল্ট-ইন রয়েছে (বিভিন্ন গ্লোবাল অবজেক্ট, বিভিন্ন কনস্ট্রাক্টর ইত্যাদি)। এর ফলে অপ্রত্যাশিত ফলাফল হতে পারে।

উদাহরণস্বরূপ, [] instanceof window.frames[0].Arrayফিরে আসবে false, কারণ Array.prototype !== window.frames[0].Arrayএবং অ্যারেগুলি পূর্ব থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
এছাড়াও, এটি অপরিজ্ঞাত মানের উপর ব্যবহার করা যাবে না, কারণ এর কোনও প্রোটোটাইপ নেই।

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

এখন আসুন একটি কৌতুকপূর্ণ জিনিস সম্পর্কে কথা বলা যাক। আপনি যদি কোনও আদিম টাইপ তৈরি করতে কনস্ট্রাক্টর ব্যবহার করেন?

let num = new Number(5);
console.log(num instanceof Number); // print true
console.log(typeof num); // print object
num++; //num is object right now but still can be handled as number
//and after that:
console.log(num instanceof Number); // print false
console.log(typeof num); // print number

যাদু বলে মনে হচ্ছে। তবে তা নয়। এটি তথাকথিত বক্সিং (বস্তু দ্বারা আদিম মান মোড়ানো) এবং আনবক্সিং (বস্তু থেকে মোড়ানো আদিম মান বের করা)। এই জাতীয় কোডটি "কিছুটা" ভঙ্গুর বলে মনে হচ্ছে। অবশ্যই আপনি নির্মাণকারীদের সাথে আদিম ধরণের তৈরি এড়াতে পারবেন। কিন্তু অন্য সম্ভাব্য পরিস্থিতি রয়েছে, যখন বক্সিং আপনাকে আঘাত করতে পারে। আপনি যখন আদিম ধরণে Function.call () বা Function.apply () ব্যবহার করেন।

function test(){
  console.log(typeof this);
} 
test.apply(5);

এড়াতে আপনি কঠোর মোড ব্যবহার করতে পারেন:

function test(){
  'use strict';
  console.log(typeof this);
} 
test.apply(5);

আপডেট: ECMAScript 2015 সাল থেকে, সিম্বল নামে আরও একটি প্রকার রয়েছে, যার নিজস্ব টাইপটি == "প্রতীক" রয়েছে

console.log(typeof Symbol());
// expected output: "symbol"

আপনি এটি সম্পর্কে এমডিএন এ পড়তে পারেন: ( প্রতীক , টাইপফ )।


2
if an object is created by a given constructor এটি ভুল। o instanceof Cসি প্রোটোটাইপ থেকে ও উত্তরাধিকার সূত্রে প্রাপ্ত হলে সত্যটি আসবে। আপনি আপনার উত্তরে পরে এ সম্পর্কে কিছু উল্লেখ করেছেন তবে এটি খুব পরিষ্কার নয়।
ওয়েনামিত

1
ভুল ... বইটি থেকে: " github.com/getify/You-Dont-Know-JS " উদাহরণস্বরূপ ফু; // সত্য উদাহরণস্বরূপ অপারেটর একটি বাম-হাতের ক্রিয়াকলাপ এবং ডান হাতের ক্রিয়াকলাপ হিসাবে কোনও ফাংশন নেয় plain প্রশ্নের উদাহরণগুলির উত্তরগুলি হ'ল: সম্পূর্ণরূপে [[প্রোটোটাইপ]] শৃঙ্খলে, ফু.প্রোটোটাইপের দ্বারা নির্বিচারে নির্দেশ করা বস্তুটি কি কখনও উপস্থিত হয়?
দ্বীন জন

1
আরও সঠিক হতে আমি উত্তরটি সম্পাদনা করেছি। আপনার মন্তব্যের জন্য ধন্যবাদ।
ভ্লাদিমির লিউবিমভ

এছাড়াও, বক্সিং / আনবক্সিং ইস্যুর ব্যাখ্যা যুক্ত করা হয়েছিল।
ভ্লাদিমির লিউবিমভ

15

আমি সাফারি 5 এবং ইন্টারনেট এক্সপ্লোরার 9-তে কিছু আকর্ষণীয় ("ভয়ঙ্কর" হিসাবে পড়ুন) আচরণটি আবিষ্কার করেছি এবং আমি এটি ক্রোম এবং ফায়ারফক্সে দুর্দান্ত সাফল্যের সাথে ব্যবহার করছি।

if (typeof this === 'string') {
    doStuffWith(this);
}

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

আমার মস্তিষ্ক প্রায় ফেটে গেল।

সুতরাং এখন আমি এটি স্থির করেছি:

if (this instanceof String || typeof this === 'string')
    doStuffWith(this.toString());
}

এবং এখন সবকিছু দুর্দান্ত কাজ করে। নোট করুন যে আপনি কল করতে পারেন "a string".toString()এবং এটি কেবল স্ট্রিংয়ের একটি অনুলিপি প্রদান করে

"a string".toString() === new String("a string").toString(); // true

সুতরাং আমি এখন থেকে উভয় ব্যবহার করব।


8

অন্যান্য উল্লেখযোগ্য ব্যবহারিক পার্থক্য:

// Boolean

var str3 = true ;

alert(str3);

alert(str3 instanceof Boolean);  // false: expect true  

alert(typeof str3 == "boolean" ); // true

// Number

var str4 = 100 ;

alert(str4);

alert(str4 instanceof Number);  // false: expect true   

alert(typeof str4 == "number" ); // true

7

instanceofআমি মনে করি যখন callbackএকটি উপপ্রকার হয় তখনও কাজ করেFunction


4

instanceofজাভাস্ক্রিপ্টে ফ্ল্যাশ হতে পারে - আমি বিশ্বাস করি যে বড় ফ্রেমওয়ার্কগুলি এর ব্যবহার এড়াতে চেষ্টা করে। বিভিন্ন উইন্ডোগুলি যেভাবে এটি ভেঙে যেতে পারে তার মধ্যে একটি হল - আমি বিশ্বাস করি শ্রেণি শ্রেণিবিন্যাসগুলিও এটি বিভ্রান্ত করতে পারে।

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

function isFunction(obj) {
  return typeof(obj) == "function";
}
function isArray(obj) {
  return typeof(obj) == "object" 
      && typeof(obj.length) == "number" 
      && isFunction(obj.push);
}

ইত্যাদি।


2
আপনি যদি না জানতেন তবে টাইপফুলের জন্য প্রথম বন্ধনীর প্রয়োজন নেই কারণ এটি একটি মূলশব্দ এবং কোনও ফাংশন নয়। এবং IMHO আপনার == এর পরিবর্তে === ব্যবহার করা উচিত।
কিছু

5
@ কিছু আপনি টাইফফ সম্পর্কে ঠিক বলেছেন তবে এই ক্ষেত্রে === প্রয়োজন নেই, কেবল তখনই প্রয়োজন যখন তুলনা করা মান একই ধরণের না হয়ে সমান হতে পারে। এখানে, এটি পারে না।
নিকোল

@ কি টাইপফ কি কখনও স্ট্রিং ব্যতীত অন্য কিছু ফেরত দেয়?
কেনেথ জে

সুতরাং isArray এর জন্য ভুল হবে, বলুন, একটি ধাক্কা পদ্ধতি এবং একটি সংখ্যার দৈর্ঘ্যের বৈশিষ্ট্যযুক্ত স্ট্যাক অবজেক্ট। কোন পরিস্থিতিতে (অ্যারে উদাহরণস্বরূপ) ভুল হবে?
ক্রিস নয়ে

@ ক্রিসনো একাধিক ফ্রেমের মধ্যে ভাগ করা বস্তুগুলির সাথে সমস্যাটি দেখা দিয়েছে: groups.google.com/forum/#!msg/comp.lang.javascript/XTWYCOwC96I/…

3

instanceofআদিমদের জন্য কাজ করবে না যেমন "foo" instanceof Stringফিরে আসবে falseযেখানে typeof "foo" == "string"ফিরে আসবে true

অন্যদিকে typeofকাস্টম অবজেক্টগুলির (বা ক্লাসগুলি, আপনি যা কিছু কল করতে চান) এর ক্ষেত্রে সম্ভবত আপনি যা চান তা করতে পারে না। উদাহরণ স্বরূপ:

function Dog() {}
var obj = new Dog;
typeof obj == 'Dog' // false, typeof obj is actually "object"
obj instanceof Dog  // true, what we want in this case

এটি ঠিক তাই ঘটে যে ফাংশনগুলি উভয়ই 'ফাংশন' আদিম এবং 'ফাংশন' এর উদাহরণ, যা অন্যান্য আদিম ধরণের জন্য যেমন এর মতো কাজ করে না এমন একটি অদ্ভুততা is

(typeof function(){} == 'function') == (function(){} instanceof Function)

কিন্তু

(typeof 'foo' == 'string') != ('foo' instanceof String)

3

আমি প্রোটোটাইপ ব্যবহার করার পরামর্শ দেব callback.isFunction()

তারা পার্থক্যটি খুঁজে পেয়েছে এবং আপনি তাদের কারণগুলি বিবেচনা করতে পারেন।

আমার ধারণা অন্যান্য জেএস ফ্রেমওয়ার্কগুলিতেও এটি রয়েছে।

instanceOfআমি বিশ্বাস করি যে অন্যান্য উইন্ডোতে সংজ্ঞায়িত ফাংশনগুলিতে কাজ করবে না। তাদের ফাংশন আপনার থেকে ভিন্ন window.Function


3

কোনও ফাংশনের জন্য পরীক্ষা করার সময়, অবশ্যই সর্বদা ব্যবহার করা উচিত typeof

পার্থক্য এখানে:

var f = Object.create(Function);

console.log(f instanceof Function); //=> true
console.log(typeof f === 'function'); //=> false

f(); // throws TypeError: f is not a function

এজন্য কারও কখনই instanceofকোনও ফাংশন পরীক্ষা করার জন্য ব্যবহার করা উচিত নয় ।


আমি যুক্তি দিতে পারি যে এটি typeofযে ভুল তা - fএটি নীচের সমস্ত: একটি Object(একটি বস্তু) এবং একটি Function(একটি ফাংশন)। আমার ব্যতীত এটি ব্যবহারে আরও বেশি অর্থবোধ করে instanceofকারণ এটি একটি ফাংশন জেনেও আমি জানি এটিও একটি অবজেক্ট, যেহেতু সমস্ত ফাংশন ECMAScript এ অবজেক্ট। কথোপকথনটি সত্য নয় - typeofএটি থেকে জেনে fরাখা আসলেই objectআমি জানি না এটিও একটি ফাংশন।
amn

@ আমার জন্য, এটি ফাংশনের একটি ভাঙা দৃষ্টান্ত। এটা তোলে মত বৈশিষ্ট্য পায় length, nameএবং callফাংশন থেকে, কিন্তু তাদের সব বিলুপ্ত হয়। কি খারাপ, এটা বলা যাবে না এবং TypeErrorএটা বলে: f is not a function
মার্টিনাস

2

উল্লেখযোগ্য ব্যবহারিক পার্থক্য:

var str = 'hello word';

str instanceof String   // false

typeof str === 'string' // true

আমাকে জিজ্ঞাসা করবেন না কেন।


11
কারণ এখানে strএকটি স্ট্রিং আদিম, স্ট্রিং অবজেক্ট নয়। সংখ্যার আদিম এবং বুলিয়ান আদিমদের জন্য একই, তারা তাদের "নির্মিত" অংশগুলির, স্ট্রিং, সংখ্যা এবং বুলিয়ান বস্তুর উদাহরণ নয়। জাভাস্ক্রিপ্ট যখন প্রয়োজন হয় তখন এই তিনটি আদিম পদার্থকে স্বয়ংক্রিয়ভাবে রূপান্তর করে (যেমন বস্তুর প্রোটোটাইপ শৃঙ্খলে কোনও পদ্ধতি ব্যবহার করা)। আপনার ব্যবহারিক পার্থক্যের উল্টোদিকে, উদাহরণস্বরত অ্যারেগুলির জন্য যাচাই করার জন্য ভাল typeof [] == "object" // true
অ্যান্ডি ই

2

কর্মক্ষমতা

typeofinstanceofউভয় প্রযোজ্য ক্ষেত্রে তার চেয়ে দ্রুততর is

আপনার ইঞ্জিনের উপর নির্ভর করে পারফরম্যান্সের পার্থক্যটি typeofপ্রায় 20% হতে পারে । ( আপনার মাইলেজ পরিবর্তিত হতে পারে )

এখানে এর জন্য একটি মানদণ্ড পরীক্ষা করা হচ্ছে Array:

var subject = new Array();
var iterations = 10000000;

var goBenchmark = function(callback, iterations) {
    var start = Date.now();
    for (i=0; i < iterations; i++) { var foo = callback(); }
    var end = Date.now();
    var seconds = parseFloat((end-start)/1000).toFixed(2);
    console.log(callback.name+" took: "+ seconds +" seconds.");
    return seconds;
}

// Testing instanceof
var iot = goBenchmark(function instanceofTest(){
     (subject instanceof Array);
}, iterations);

// Testing typeof
var tot = goBenchmark(function typeofTest(){
     (typeof subject == "object");
}, iterations);

var r = new Array(iot,tot).sort();
console.log("Performance ratio is: "+ parseFloat(r[1]/r[0]).toFixed(3));

ফলাফল

instanceofTest took: 9.98 seconds.
typeofTest took: 8.33 seconds.
Performance ratio is: 1.198

1
টাইপফুল বিষয় == "অ্যারে" এর মিথ্যা প্রত্যাবর্তন করা উচিত। টাইপফুল বিষয়টি "অবজেক্ট"।
শারদুল

কিভাবে টাইপফুট দ্রুত হয়? জাভাস্ক্রিপ্ট আক্ষরিক স্ট্রিং ইন্টার্ন করা হয়?
গ্রেগরি মাগারশাক

কারণটি হ'ল: instanceof সর্বদা অবজেক্টের প্রোটোটাইপ চেইন অনুসরণ করে, সুতরাং পারফরম্যান্স পেনাল্টি নির্ভর করে যে ক্লাস কতটা প্রোটোটাইপ চেইনে রয়েছে তার instanceofবিরুদ্ধে পরীক্ষা করা হয়। সুতরাং সংক্ষিপ্ত উত্তরাধিকার শৃঙ্খলার জন্য জরিমানা কম হবে (যেমন [] instanceof Array,, {} instanceof Object) এবং দীর্ঘতর - আরও বড়। সুতরাং, উভয় যদি obj instanceof SomeClassএবং typeof obj !== 'string'উপায়ে কিছু আপনার প্রকল্পিত কোড দৃষ্টিকোণ থেকে একই (Fe আপনি শুধু একটি পরীক্ষা উপার্জন যদি if, এবং switchএকাধিক শ্রেণীর ইত্যাদি মাধ্যমে -ing), তারপর আপনি ভাল দ্বিতীয় বাছাই চাই, কর্মক্ষমতা প্রজ্ঞাময়,
ankhzet

2

এটি এখানে অন্যান্য সমস্ত ব্যাখ্যাগুলির পরিপূরক জ্ঞান - আমি সর্বত্র ব্যবহার করার পরামর্শ দিচ্ছি না.constructor

টি এল; ডিআর: পরিস্থিতিতে যেখানে typeofএকটি বিকল্প নয়, এবং যখন আপনি কি জানেন যে আপনি প্রোটোটাইপ শৃঙ্খল যত্ন সম্পর্কে না , Object.prototype.constructorএকটি টেকসই বা এমনকি ভালো বিকল্প চেয়ে হতে পারে instanceof:

x instanceof Y
x.constructor === Y

এটি 1.1 সাল থেকে স্ট্যান্ডার্ডে রয়েছে, সুতরাং পিছনের সামঞ্জস্যতা নিয়ে কোনও উদ্বেগ নেই।

মুহাম্মদ উমার এখানে কোথাও একটি মন্তব্যে সংক্ষেপে এটি উল্লেখ করেছিলেন। এটি একটি প্রোটোটাইপ দিয়ে সমস্ত কিছুতে কাজ করে - তাই সবকিছু না nullবা undefined:

// (null).constructor;      // TypeError: null has no properties
// (undefined).constructor; // TypeError: undefined has no properties

(1).constructor;                 // function Number
''.constructor;                  // function String
([]).constructor;                // function Array
(new Uint8Array(0)).constructor; // function Uint8Array
false.constructor;               // function Boolean()
true.constructor;                // function Boolean()

(Symbol('foo')).constructor;     // function Symbol()
// Symbols work, just remember that this is not an actual constructor:
// new Symbol('foo'); //TypeError: Symbol is not a constructor

Array.prototype === window.frames.Array;               // false
Array.constructor === window.frames.Array.constructor; // true

তদুপরি, আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে এটি এর চেয়ে অনেক বেশি দ্রুত হতে পারে instanceof(কারণ এটি সম্ভবত পুরো প্রোটোটাইপ চেইনটি পরীক্ষা করতে হবে না)। আমার ক্ষেত্রে একটি মান টাইপ করা অ্যারে কিনা তা পরীক্ষা করার জন্য আমার দ্রুত উপায় প্রয়োজন:

function isTypedArrayConstructor(obj) {
  switch (obj && obj.constructor){
    case Uint8Array:
    case Float32Array:
    case Uint16Array:
    case Uint32Array:
    case Int32Array:
    case Float64Array:
    case Int8Array:
    case Uint8ClampedArray:
    case Int16Array:
      return true;
    default:
      return false;
  }
}

function isTypedArrayInstanceOf(obj) {
  return obj instanceof Uint8Array ||
    obj instanceof Float32Array ||
    obj instanceof Uint16Array ||
    obj instanceof Uint32Array ||
    obj instanceof Int32Array ||
    obj instanceof Float64Array ||
    obj instanceof Int8Array ||
    obj instanceof Uint8ClampedArray ||
    obj instanceof Int16Array;
}

https://run.perf.zone/view/isTypedArray-constructor-vs-instanceof-1519140393812

এবং ফলাফল:

Chrome 64.0.3282.167 (-৪-বিট, উইন্ডোজ)

টাইপযুক্ত অ্যারে উদাহরণস্বরূপ বনাম কনস্ট্রাক্টর - ক্রোম 1.5.০.৩২২২.১67 in (-৪-বিট, উইন্ডোজ) এ 1.5x দ্রুত

ফায়ারফক্স 59.0b10 (-৪-বিট, উইন্ডোজ)

বনাম নির্মাণকারী টাইপযুক্ত অ্যারে উদাহরণস্বরূপ - ফায়ারফক্স 59.0b10 (30-বিট, উইন্ডোজ) এ 30x দ্রুত

কৌতূহলের বাইরে, আমি এর বিরুদ্ধে একটি দ্রুত খেলনা বেঞ্চমার্ক করেছি typeof; আশ্চর্যজনকভাবে এটি আরও খারাপ সঞ্চালন করে না, এবং এটি ক্রোমে আরও কিছুটা দ্রুত বলে মনে হচ্ছে:

let s = 0,
    n = 0;

function typeofSwitch(t) {
    switch (typeof t) {
        case "string":
            return ++s;
        case "number":
            return ++n;
        default:
            return 0;
    }
}

// note: no test for null or undefined here
function constructorSwitch(t) {
    switch (t.constructor) {
        case String:
            return ++s;
        case Number:
            return ++n;
        default:
            return 0;
    }
}

let vals = [];
for (let i = 0; i < 1000000; i++) {
    vals.push(Math.random() <= 0.5 ? 0 : 'A');
}

https://run.perf.zone/view/typeof-vs-constructor-string-or-number-1519142623570

দ্রষ্টব্য: ক্রমে ইমেজগুলির মধ্যে স্যুইচগুলি তালিকাভুক্ত করা হয়েছে!

Chrome 64.0.3282.167 (-৪-বিট, উইন্ডোজ)

স্ট্রিং / সংখ্যা টাইপফ বনাম কনস্ট্রাক্টর - ক্রোমে 1.৪.০.৩২২২.১67 in এ (১ 64২x এক্স দ্রুত) (-৪-বিট, উইন্ডোজ)

ফায়ারফক্স 59.0b10 (-৪-বিট, উইন্ডোজ)

দ্রষ্টব্য: ক্রমে ইমেজগুলির মধ্যে স্যুইচগুলি তালিকাভুক্ত করা হয়েছে!

স্ট্রিং / নম্বর টাইপফ বনাম কনস্ট্রাক্টর - ফায়ারফক্স 59.0b10 (০. 0.৮ বিট, উইন্ডোজ) এ 0.78x ধীর


1

উদাহরণস্বরূপ ব্যবহার করুন কারণ আপনি যদি শ্রেণীর নাম পরিবর্তন করেন তবে আপনি একটি সংকলক ত্রুটি পাবেন।


1

var newObj =  new Object;//instance of Object
var newProp = "I'm xgqfrms!" //define property
var newFunc = function(name){//define function 
	var hello ="hello, "+ name +"!";
	return hello;
}
newObj.info = newProp;// add property
newObj.func = newFunc;// add function

console.log(newObj.info);// call function
// I'm xgqfrms!
console.log(newObj.func("ET"));// call function
// hello, ET!

console.log(newObj instanceof Object);
//true
console.log(typeof(newObj));
//"object"


আমার কি করা উচিত, আমি কি ইউএ (নেভিগেটর.উজার এজেন্ট) পেতে পারি?
xgqfrms

0

আমি কঠোরভাবে ওও লালনপালনের জন্য এসেছি

callback instanceof Function

স্ট্রিংগুলি আমার ভয়ঙ্কর বানান বা অন্য টাইপগুলির হয়। প্লাস আমি এটি আরও ভাল পড়া অনুভূত।


0

উদাহরণস্বরূপ যদিও টাইপফুলটি কিছুটা দ্রুত হতে পারে তবুও আমি এ জাতীয় সম্ভাব্য যাদুটির কারণে দ্বিতীয়টিকে পছন্দ করি:

function Class() {};
Class.prototype = Function;

var funcWannaBe = new Class;

console.log(funcWannaBe instanceof Function); //true
console.log(typeof funcWannaBe === "function"); //false
funcWannaBe(); //Uncaught TypeError: funcWannaBe is not a function

0

আরও একটি ক্ষেত্রে আপনি কেবল instanceofএটির সাথে কোলেটিং করতে পারবেন - এটি সত্য বা মিথ্যা প্রত্যাবর্তন করে। সাথে typeofআপনি সরবরাহের ধরণ পেতে পারেন কিছু


0

কর্মক্ষমতা মাথায় রেখে, আপনি আদর্শ হার্ডওয়্যার দিয়ে টাইপফোনটি আরও ভালভাবে ব্যবহার করতে চাইবেন, যদি আপনি নির্দেশটি 10 ​​মিলিয়ন পুনরাবৃত্তির একটি লুপ দিয়ে একটি স্ক্রিপ্ট তৈরি করেন তবে টাইফফ আর্ট == 'স্ট্রিং' 9 মিমি লাগবে এবং স্ট্রিংয়ের ক্ষেত্রে 19 মিমি লাগবে


0

অবশ্যই ব্যাপারটা ........!

আসুন উদাহরণ সহ এটি চলুন our আমাদের উদাহরণে আমরা দুটি ভিন্ন উপায়ে ফাংশন ঘোষণা করব।

আমরা উভয় function declarationএবং ফাংশন কনস্ট্রাক্টর ব্যবহার করব । SE আমরা কীভাবে দেখানো হবে typeofএবং instanceofঐ দুটি ভিন্ন পরিস্থিতিতে আচরণ করে।

ফাংশন ডিক্লেয়ারেশন ব্যবহার করে ফাংশন তৈরি করুন:

function MyFunc(){  }

typeof Myfunc == 'function' // true

MyFunc instanceof Function // false

যেমন বিভিন্ন ফলাফলের জন্য সম্ভাব্য ব্যাখ্যা, হিসাবে আমরা একটি ফাংশন ঘোষণা করেছেন, typeofবুঝতে পারেন যে এটি একটি function.Because হয় typeofচেক থাকুক বা না থাকুক অভিব্যক্তি যার উপর typeof উপর অপারেশন, আমাদের ক্ষেত্রে বাস্তবায়িত কল পদ্ধতি বা না । যদি এটি পদ্ধতিটি প্রয়োগ করে তবে এটি একটি ফাংশন ther অন্যদিকে নয় rificMyFunc Call

ফাংশন কনস্ট্রাক্টর ব্যবহার করে ফাংশন তৈরি করুন:

var MyFunc2 = new Function('a','b','return a+b') // A function constructor is used 

typeof MyFunc2 == 'function' // true

MyFunc2 instanceof Function // true

এখানে typeofasserts যে MyFunc2একটি ফাংশন সেইসাথে instanceofoperator.We ইতিমধ্যে জানেন typeofচেক যদি MyFunc2বাস্তবায়িত Callপদ্ধতি বা not.As MyFunc2একটি ফাংশন এবং এটি প্রয়োগ callপদ্ধতি, যে কিভাবে এর typeofজানে যে এটা একটা function.On অন্যদিকে, আমরা ব্যবহৃত function constructorতৈরি করতে MyFunc2, এটা এর একটি দৃষ্টান্ত হয়ে Function constructor.That কেন instanceofএছাড়াও সমাধান করা true

ব্যবহার করা কি নিরাপদ?

আমরা উভয় ক্ষেত্রেই দেখতে পারেন typeofঅপারেটর সফলভাবে জাহির পারি যে, আমরা একটি ফাংশন এখানে ডিল করা হয়, এটা চেয়ে নিরাপদ instanceofinstanceofক্ষেত্রে ব্যর্থ হবে function declarationকারণ function declarationsএর উদাহরণ নয় Function constructor

ভাল অভ্যাস :

হিসাবে গ্যারি Rafferty প্রস্তাব, সবচেয়ে ভালো উপায় উভয় typeof এবং instanceof একসঙ্গে ব্যবহার করা উচিত।

  function isFunction(functionItem) {

        return typeof(functionItem) == 'function' || functionItem instanceof Function;

  }

  isFunction(MyFunc) // invoke it by passing our test function as parameter

এই উত্তর সম্পর্কে কোনও গঠনমূলক সমালোচনা প্রশংসা করা হবে।
আ-জামি

0

খুব সুনির্দিষ্ট উদাহরণ হিসাবে ব্যবহার করা উচিত যেখানে উদাহরণস্বরূপ কনস্ট্রাক্টরের (সাধারণত কাস্টম প্রকারের) মাধ্যমে মান তৈরি করা হয়

var d = new String("abc")

যদিও টাইপটি কেবলমাত্র উদাহরণ হিসাবে অ্যাসাইনমেন্ট দ্বারা তৈরি করা মানগুলি পরীক্ষা করে

var d = "abc"

0

উপরের টন উদাহরণগুলির সাথে অভিভূত হওয়ার দরকার নেই, কেবল দুটি দৃষ্টিভঙ্গি মাথায় রাখুন:

  1. typeof var;একটি অ্যানারি অপারেটরটি মূল প্রকার বা মূল প্রকারের ভেরি ফেরত দেবে। তাই এটি আদিম ধরনের (ফিরে আসবে যে string, number, bigint, boolean, undefined, এবং symbol) অথবা objectপ্রকার।

  2. উচ্চ-স্তরের অবজেক্টের ক্ষেত্রে যেমন বিল্ট-ইন অবজেক্টস (স্ট্রিং, সংখ্যা, বুলিয়ান, অ্যারে ..) বা জটিল বা কাস্টম অবজেক্টগুলির ক্ষেত্রে এগুলি সবই objectমূল ধরণের, তবে উদাহরণস্বরূপ বিল্ট বেসগুলি পৃথক (ওওপি ক্লাসের মতো) উত্তরাধিকার ধারণা), এখানে a instanceof A- একটি বাইনারি অপারেটর - আপনাকে সহায়তা করবে, ডান অপরেন্ডের (এ) এর নির্মাণকারী উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য এটি প্রোটোটাইপ চেইনের মধ্য দিয়ে যাবে।

সুতরাং আপনি যখনই "রুট টাইপ" পরীক্ষা করতে চান বা আদিম ভেরিয়েবলের সাথে কাজ করতে চান - "টাইপফ" ব্যবহার করুন, অন্যথায় "উদাহরণস্বরূপ" ব্যবহার করুন।

nullএটি একটি বিশেষ কেস, যা আপাতদৃষ্টিতে আদিম, তবে বস্তুটির জন্য এটি একটি বিশেষ ক্ষেত্রে। ব্যবহারa === nullপরিবর্তে নাল পরীক্ষা করতে ।

অন্যদিকে, functionএটি একটি বিশেষ কেস, যা অন্তর্নির্মিত অবজেক্ট তবেtypeof রিটার্নে রয়েছেfunction

আপনি দেখতে পাচ্ছেন instanceofযে প্রোটোটাইপ চেইনের মধ্য দিয়ে যেতে হবে এই typeofমুহুর্তে একবারে মূলের ধরণটি যাচাই করে নেওয়া উচিত কেন এর typeofচেয়ে দ্রুত কেন তা সহজেই বোঝা যায়instanceof


0

টাইপফফ সম্পর্কে এমডিএন ডকুমেন্টেশন অনুসারে , "নতুন" কীওয়ার্ড দিয়ে ইনস্ট্যান্ট করা অবজেক্টগুলি 'অবজেক্ট' টাইপের হয়:

typeof 'bla' === 'string';

// The following are confusing, dangerous, and wasteful. Avoid them.
typeof new Boolean(true) === 'object'; 
typeof new Number(1) === 'object'; 
typeof new String('abc') === 'object';

যদিও instanceof সম্পর্কে ডকুমেন্টেশন পয়েন্ট যে:

const objectString = new String('String created with constructor');
objectString instanceOf String; // returns true
objectString instanceOf Object; // returns true

সুতরাং যদি কেউ পরীক্ষা করতে চান যে কোনও কিছু এটির তৈরি কীভাবেই হোক না কেন স্ট্রিং, নিরাপদ পদ্ধতির ব্যবহার হ'ল instanceof

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