কোনও ভেরিয়েবল ফাংশনের ধরণের কিনা তা পরীক্ষা করুন


902

ধরুন আমার কাছে কোনও পরিবর্তনশীল রয়েছে, যা নিম্নলিখিত হিসাবে সংজ্ঞায়িত হয়েছে:

var a = function() {/* Statements */};

আমি এমন একটি ফাংশন চাই যা যাচাই করতে পারে যে ভেরিয়েবলের ধরণটি ফাংশন-জাতীয় কিনা। অর্থাত:

function foo(v) {if (v is function type?) {/* do something */}};
foo(a);

আমি কিভাবে পরীক্ষা করতে পারবেন যদি পরিবর্তনশীল aধরনের হয় Functionপথ উপরে সংজ্ঞায়িত কি?


উত্তর:


380

শিওর আন্ডারস্কোরের উপায়টি আরও দক্ষ, তবে দক্ষতার বিষয়টি যখন পরীক্ষা না করা যায় তা যাচাই করার সর্বোত্তম উপায়, @ পল রোসানিয়া লিঙ্কযুক্ত আন্ডারস্কোরের পৃষ্ঠায় লেখা হয়েছে।

আন্ডারস্কোর দ্বারা অনুপ্রাণিত হয়ে, চূড়ান্তটি হ'ল ফাংশন ফাংশনটি নিম্নরূপ:

function isFunction(functionToCheck) {
 return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}

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

24
সঙ্গে আপডেট কর্মক্ষমতা পরীক্ষা মনে হচ্ছে বিপুল গতি আপনার ব্রাউজার উপর নির্ভর করে পার্থক্য মত। ক্রোমে typeof(obj) === 'function'এখন পর্যন্ত দ্রুততম উপস্থিতি উপস্থিত হয়; তবে ফায়ারফক্সে obj instanceof Functionস্পষ্ট বিজয়ী।
জাস্টিন ওয়ার্কেন্টিন

7
অংশটি সম্পর্কে: টাইপটি কেবল ভেরিয়েবল বা বৈশিষ্ট্য অপরিজ্ঞাত কিনা তা পরীক্ষা করার জন্য ব্যবহার করা উচিত। javascript.info/tutorial/type-detection মধ্যে typeof একটি ভাল ব্যবহার অধ্যায় এবং এক নিম্নলিখিত লেখক রাজ্যের যে ক্ষেত্রে ঠিক বিপরীত
কনরাড Madej

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

14
অযৌক্তিকভাবে overcomplicated সমাধান
ড্যানিয়েল গারমোশকা 20 '12

1709
if (typeof v === "function") {
    // do something
}

44
শুধু কিছু বিষয় জন্য সতর্ক typeof Object, typeof Dateএবং typeof String, যা সব আগমন 'function'খুব।
ডেভ ওয়ার্ড

358
@ ডেভ, সমস্যাগুলি যেহেতু সমস্যাগুলি সেহেতু আমি নিশ্চিত নই those
ম্যাথু ক্রামলে

6
এর সাথে পার্থক্য কী if (v instanceOf Function)?
ম্যাকান্ডালল

10
@ ম্যাক্যান্ডেল কোনও বড় পার্থক্য নেই, instanceofআপনি অন্য ডকুমেন্ট থেকে আগত কোনও ফাংশন (যদি কোনও আইফ্রেম, সম্ভবত) পরীক্ষা করে থাকেন তবে কাজ করবে না except পারফরম্যান্স পরিবর্তিত হয়।
rvighne

8
গৃহীত উত্তরের বিপরীতে এটি অ্যাসিঙ্ক ফাংশনগুলির জন্যও কাজ করে। একটি হিসাবে asyncfunctionToCheck, getType.toString.call(functionToCheck)==='[object AsyncFunction]'যেখানেtypeof asyncfunctionToCheck === 'function'
TDreama

132

অ্যান্ডস্কোর.জেএস আরও বিস্তৃত তবে অত্যন্ত পারফরম্যান্ট পরীক্ষা ব্যবহার করে:

_.isFunction = function(obj) {
  return !!(obj && obj.constructor && obj.call && obj.apply);
};

দেখুন: http://jsperf.com/al বিকল্প-isfunction-implementations

সম্পাদনা: আপডেট করা পরীক্ষাগুলি প্রস্তাব দেয় যে টাইপফুলটি দ্রুত হতে পারে, দেখুন http://jsperf.com/al বিকল্প-isfunction- implementations/4


এই পদ্ধতির চেয়ে কোন বিশেষ কারণ ব্যবহার করার কি আছে typof?
এসভি_ইন

1
ইন্ডসকোরের সংস্করণ বেশিরভাগ ব্রাউজারে আরও দ্রুত। দেখুন: jsperf.com/al বিকল্প-isfunction
পল

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

3
@ পাওলরোসানিয়া আজ এই পারফরম্যান্স পরীক্ষাগুলি হোঁচট খেয়েছে এবং এগুলি পুনর্বিবেচনা 4 হিসাবে যাচাইকরণের সাথে আরও বেশি পরীক্ষার ডেটা দিয়ে আপডেট করেছে - দয়া করে ব্রাউজার পরীক্ষার কভারেজ বাড়ানোর জন্য এটি চালান। এটি প্রতি সেকেন্ডের ক্রিয়াকলাপে ধীরে ধীরে (অনেকগুলি পরীক্ষার কারণে), তবে এটি প্রয়োগের একটি পার্থক্যও দেখায় (আপনার জাভাস্ক্রিপ্ট কনসোলটি খুলুন এবং পুনরায় লোড করুন পৃষ্ঠাতে লগ ত্রুটি বার্তা থাকতে পারে)। দ্রষ্টব্য: রিভিশন 3 যুক্ত করেছে isFunctionD (কেবলমাত্র ভিত্তিতে typeof == "function") - এবং এটি অ্যান্ডস্কোরের "দ্রুত" সংস্করণের চেয়ে অনেক দ্রুত গতিতে বলে মনে হচ্ছে ।
জোয়েল পুররা

6
এই উত্তরটি এখন কিছুটা বিভ্রান্তিমূলক, কারণ অ্যান্ডস্কোর.জেএস এখন বিকল্প পুনর্নির্মাণের পরীক্ষাটির উপরোক্ত রেফারেন্সযুক্ত সংশোধন 4 নয়, পুনর্বিবেচনা 12 -এ রয়েছে isFunction()। এটি বর্তমানে দানডেনের পরামর্শের খুব কাছাকাছি কিছু ব্যবহার করে ।
জোনাথন ইউনিস

112

বিভিন্ন উপায় আছে তাই আমি তাদের সমস্ত সংক্ষিপ্ত করব

  1. সেরা উপায় হ'ল:
    ফাংশন foo (v) - যদি (v উদাহরণস্বরূপ ফাংশন) {/ * কিছু করুন * /}};
    
    
    সর্বাধিক পারফরম্যান্ট (কোনও স্ট্রিং তুলনা নেই) এবং মার্জিত সমাধান - উদাহরণস্বরূপ অপারেটরটি দীর্ঘ সময়ের জন্য ব্রাউজারগুলিতে সমর্থিত হয়েছে, তাই চিন্তা করবেন না - এটি IE 6 এ কাজ করবে।
  2. পরবর্তী সেরা উপায় হ'ল:
    ফাংশন foo (v) {if (typof v === "ফাংশন") {/ * কিছু করুন * /}};
    
    
    এর অসুবিধা typeofহ'ল এটি নিঃশব্দ ব্যর্থতার পক্ষে সংবেদনশীল, খারাপ, যদি আপনার টাইপ (উদাহরণস্বরূপ "ফিকশন") থাকে - তবে এই ক্ষেত্রে the if` ঠিক মিথ্যা প্রত্যাবর্তন করবে এবং আপনি জানেন না যে আপনার পরে কোনও ত্রুটি আছে তোমার গোপন সংকেত
  3. পরবর্তী সেরা উপায় হ'ল:
    ফাংশনটি হ'ল ফাংশন (ফাংশনটোচেক) {
        var getType = {};
        ফাংশনটি ফিরুন
    }
    
    
    সমাধান # 1 বা # 2 এর ক্ষেত্রে এর কোনও সুবিধা নেই তবে এটি খুব কম পাঠযোগ্য। এটির একটি উন্নত সংস্করণ
    ফাংশনটি হ'ল ফাংশন (এক্স) {
        প্রত্যাবর্তন অবজেক্ট.প্রোটোটাইপ.টোস্ট্রিং.সিএল (এক্স) == '[অবজেক্ট ফাংশন]';
    }
    
    
    তবে সমাধান # 1 এর চেয়ে এখনও অনেক কম শব্দার্থক

10
কোনও ফাংশন অন্য ফ্রেমের প্রসঙ্গে প্রেরণের ক্ষেত্রে প্রথম সমাধানটি ব্যর্থ হয়। উদাহরণস্বরূপ, একটি iframe থেকে top.Function !== Function। নিশ্চিত হওয়ার জন্য, দ্বিতীয়টি ব্যবহার করুন ("ফাংশন" এর কোনও ভুল বানানটি ডিবাগের সময় সংশোধন করা হবে, আশা করা যায়)।
ম্যাক্সআর্ট

টাইপস সম্পর্কে আপনার বক্তব্য সম্পর্কে: এই টাইপযুক্ত যে কোনও কোডই দ্রুত ব্যর্থ হতে পারে / টাইপসের উপর ভিত্তি করে অন্য কোনও বাগের চেয়ে বেশি স্পষ্ট নয়। টাইপফ === "ফাংশন" হ'ল পরিষ্কার সমাধান। অতিরিক্তভাবে আপনার "সেরা" সমাধানটি যেখানে আপনি ব্যবহার instanceofকরেন তা একাধিক গ্লোবালগুলিকে বিবেচনা করে না, যেমন ফ্রেমগুলি জুড়ে একটি চেক, এবং মিথ্যা নেতিবাচকগুলি ফিরে আসতে পারে।
ব্রাঙ্কিম

84

jQuery (সংস্করণ 3.3 থেকে অবহেলিত) রেফারেন্স

$.isFunction(functionName);

AngularJS রেফারেন্স

angular.isFunction(value);

লোডাশ রেফারেন্স

_.isFunction(value);

বোঝার রেফারেন্স

_.isFunction(object); 

Node.js v4.0.0 যেহেতু অবচিত রেফারেন্স

var util = require('util');
util.isFunction(object);

56

@ গ্রাডেকোমপ্লেক্স: আপনার সমাধানের ভারসাম্যের যথেষ্ট পরিমাণ রয়েছে। এইভাবে লেখা থাকলে এটি আরও পরিষ্কার হবে:

function isFunction(x) {
  return Object.prototype.toString.call(x) == '[object Function]';
}

আপনার আগ্রহী অন্যান্য জাভাস্ক্রিপ্টের জন্য অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং.সিএল দরকারী You
জেসন ফোগলিয়া


35

ব্যবহার করে দেখুন instanceofঅপারেটর: মনে হচ্ছে যে সব ফাংশন থেকে উত্তরাধিকারী Functionশ্রেণী:

// Test data
var f1 = function () { alert("test"); }
var o1 = { Name: "Object_1" };
F_est = function () { };
var o2 = new F_est();

// Results
alert(f1 instanceof Function); // true
alert(o1 instanceof Function); // false
alert(o2 instanceof Function); // false

19

আরও ব্রাউজার সমর্থন সহ এমন কিছু এবং এ্যাসিঙ্ক ফাংশন অন্তর্ভুক্ত হতে পারে:

const isFunction = value => value && (Object.prototype.toString.call(value) === "[object Function]" || "function" === typeof value || value instanceof Function);

এবং তারপরে এটি পরীক্ষা করুন:

isFunction(isFunction); //true
isFunction(function(){}); //true
isFunction(()=> {}); //true
isFunction(()=> {return 1}); //true
isFunction(async function asyncFunction(){}); //true
isFunction(Array); //true
isFunction(Date); //true
isFunction(Object); //true
isFunction(Number); //true
isFunction(String); //true
isFunction(Symbol); //true
isFunction({}); //false
isFunction([]); //false
isFunction("function"); //false
isFunction(true); //false
isFunction(1); //false
isFunction("Alireza Dezfoolian"); //false


9

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

পরবর্তী কোডে কেবল বিশুদ্ধ এবং পয়েন্টফ্রি ফাংশন রয়েছে:

const R = require('ramda');

const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);

const equalsSyncFunction = isPrototypeEquals(() => {});

const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);

ES2017 হিসাবে, asyncফাংশনগুলি উপলভ্য, তাই আমরা তাদের বিরুদ্ধেও পরীক্ষা করতে পারি:

const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);

এবং তারপরে তাদের একত্রিত করুন:

const isFunction = R.either(isSyncFunction, isAsyncFunction);

অবশ্যই, ফাংশনটির বিরুদ্ধে nullএবং undefinedমানগুলির সুরক্ষা করা উচিত , সুতরাং এটি "নিরাপদ" করতে:

const safeIsFunction = R.unless(R.isNil, isFunction);

এবং, যোগফল সম্পূর্ণ স্নিপেট:

const R = require('ramda');

const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);

const equalsSyncFunction = isPrototypeEquals(() => {});
const equalsAsyncFunction = isPrototypeEquals(async () => {});

const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);

const isFunction = R.either(isSyncFunction, isAsyncFunction);

const safeIsFunction = R.unless(R.isNil, isFunction);

// ---

console.log(safeIsFunction( function () {} ));
console.log(safeIsFunction( () => {} ));
console.log(safeIsFunction( (async () => {}) ));
console.log(safeIsFunction( new class {} ));
console.log(safeIsFunction( {} ));
console.log(safeIsFunction( [] ));
console.log(safeIsFunction( 'a' ));
console.log(safeIsFunction( 1 ));
console.log(safeIsFunction( null ));
console.log(safeIsFunction( undefined ));

তবে, দ্রষ্টব্য যে উচ্চতর-ক্রিয়াকলাপের বিস্তৃত ব্যবহারের কারণে এই সমাধানটি অন্যান্য উপলব্ধ বিকল্পগুলির তুলনায় কম কার্য সম্পাদন করতে পারে।


7

আপনি Lodash ব্যবহার করেন তাহলে আপনার সাথে এটা করতে পারেন _.isFunction

_.isFunction(function(){});
// => true

_.isFunction(/abc/);
// => false

_.isFunction(true);
// => false

_.isFunction(null);
// => false

trueঅন্যথায়, মানটি যদি কোনও কার্য হয় তবে এই পদ্ধতিটি ফিরে আসে false


4

আমি দেখেছি যে যখন IE8 দেশীয় ব্রাউজার ফাংশন পরীক্ষা ব্যবহার toString, instanceofএবং typeofকাজ করে নি। এখানে একটি পদ্ধতি যা আইই 8-তে দুর্দান্ত কাজ করে (যতদূর আমি জানি):

function isFn(f){
    return !!(f && f.call && f.apply);
}
//Returns true in IE7/8
isFn(document.getElementById);

বিকল্পভাবে, আপনি ব্যবহার করে স্থানীয় ফাংশনগুলি পরীক্ষা করতে পারেন:

"getElementById" in document

যদিও আমি কোথাও পড়েছি যে এটি সর্বদা আই 7 এবং এর নীচে কাজ করবে না।



4

আমি মনে করি আপনি কেবল ফাংশন প্রোটোটাইপে একটি পতাকা সংজ্ঞায়িত করতে পারেন এবং আপনি যে উদাহরণটি পরীক্ষা করতে চান তা উত্তরাধিকার সূত্রে প্রাপ্ত কিনা তা পরীক্ষা করতে পারেন

একটি পতাকা সংজ্ঞায়িত করুন:

Function.prototype.isFunction = true; 

এবং তারপরে এটি উপস্থিত কিনা তা পরীক্ষা করে দেখুন

var foo = function(){};
foo.isFunction; // will return true

ক্ষতিটি হ'ল অন্য প্রোটোটাইপ একই পতাকাটিকে সংজ্ঞায়িত করতে পারে এবং তারপরে এটি মূল্যহীন, তবে অন্তর্ভুক্ত মডিউলগুলিতে আপনার যদি সম্পূর্ণ নিয়ন্ত্রণ থাকে তবে এটি সহজতম উপায় the


Foo অপরিজ্ঞাত করা থাকলে এটি ত্রুটির সাথে ব্যর্থ হবে। আপনি নেটিভ প্রোটোটাইপ পরিবর্তন করেছেন তা উল্লেখ না করে যা সম্পূর্ণ ভুল।
কামিল অরচোভস্কি

3

নোড v0.11 যেহেতু আপনি স্ট্যান্ডার্ড ইউজ ফাংশনটি ব্যবহার করতে পারেন:

var util = require('util');
util.isFunction('foo');

2
Use.isFunction অবচিত করা হয়েছে
কেহরান

2

আপনার জেএসে typeOfঅপারেটর ব্যবহার করা উচিত ।

var a=function(){
    alert("fun a");
}
alert(typeof a);// alerts "function"

0

কিছু পূর্ববর্তী উত্তরগুলি যেমন সমাধান দেখিয়েছে তেমন টাইপ ব্যবহার করা। নীচে নোডজেগুলিতে একটি কোড স্নিপেট রয়েছে,

    function startx() {
      console.log("startx function called.");
    }

 var fct= {};
 fct["/startx"] = startx;

if (typeof fct[/startx] === 'function') { //check if function then execute it
    fct[/startx]();
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.