জাভাস্ক্রিপ্টে কোনও ফাংশনের জন্য "সীমাহীন" ভারগুলি অনুমতি দেওয়ার কোনও উপায় আছে কি?
উদাহরণ:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
জাভাস্ক্রিপ্টে কোনও ফাংশনের জন্য "সীমাহীন" ভারগুলি অনুমতি দেওয়ার কোনও উপায় আছে কি?
উদাহরণ:
load(var1, var2, var3, var4, var5, etc...)
load(var1)
উত্তর:
অবশ্যই, arguments
অবজেক্টটি ব্যবহার করুন ।
function foo() {
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
arguments
একটি বিশেষ "অ্যারে-জাতীয়" অবজেক্ট, যার অর্থ এটির দৈর্ঘ্য রয়েছে তবে অন্য কোনও অ্যারে ফাংশন নেই। আরও তথ্যের জন্য বিকাশকারী.মোজিলা.আর.ইন- ইউএস
length
সম্পত্তি থাকা কোনও বস্তুর উপরে কাজ করে । এর মধ্যে arguments
অবজেক্টটি অন্তর্ভুক্ত রয়েছে । আমরা আরো জানি, এবং যে পদ্ধতি concat
ফেরৎ একটি কপি 'অ্যারে' এটা বলা হচ্ছে, আমরা সহজে রূপান্তর করতে পারেন arguments
এই মত একটি বাস্তব অ্যারেতে বস্তু: var args = [].concat.call(arguments)
। কিছু লোক Array.prototype.concat.call
পরিবর্তে ব্যবহার করতে পছন্দ করে তবে আমি পছন্দ করি []
তারা সংক্ষিপ্ত এবং মিষ্টি!
[...arguments].join()
(বেশিরভাগ) সাম্প্রতিক ব্রাউজারগুলিতে আপনি এই সিনট্যাক্সের সাহায্যে চলক সংখ্যক আর্গুমেন্ট গ্রহণ করতে পারেন:
function my_log(...args) {
// args is an Array
console.log(args);
// You can pass this array as parameters to another function
console.log(...args);
}
এখানে একটি ছোট উদাহরণ:
function foo(x, ...args) {
console.log(x, args, ...args, arguments);
}
foo('a', 'b', 'c', z='d')
=>
a
Array(3) [ "b", "c", "d" ]
b c d
Arguments
0: "a"
1: "b"
2: "c"
3: "d"
length: 4
ডকুমেন্টেশন এবং আরও উদাহরণ এখানে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / ফাংশন / রেস্ট_প্রেমিটার
আরেকটি বিকল্প হ'ল প্রসঙ্গ অবজেক্টে আপনার যুক্তিগুলি পাস করা।
function load(context)
{
// do whatever with context.name, context.address, etc
}
এবং এটি এটি ব্যবহার করুন
load({name:'Ken',address:'secret',unused:true})
এটির সুবিধা রয়েছে যে আপনি যতগুলি নামী আর্গুমেন্ট আপনারা চান যুক্ত করতে পারেন এবং ফাংশনটি উপযুক্ত হিসাবে এটি ব্যবহার করতে পারে (বা না)।
context
কোডটি দিয়ে যুক্তিটি তৈরি করতে এবং এটি ব্যবহারের আগে এটি পাস করতে পারেন ।
আমি কেনের উত্তরকে সবচেয়ে গতিশীল বলে একমত এবং আমি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে চাই। যদি এটি এমন কোনও ফাংশন যা আপনি বিভিন্ন যুক্তি দিয়ে একাধিকবার কল করেন - আমি কেনের নকশা ব্যবহার করি তবে তারপরে ডিফল্ট মানগুলি যুক্ত করে:
function load(context) {
var defaults = {
parameter1: defaultValue1,
parameter2: defaultValue2,
...
};
var context = extend(defaults, context);
// do stuff
}
এইভাবে, যদি আপনার অনেকগুলি পরামিতি থাকে তবে অগত্যা ফাংশনে প্রতিটি কল দিয়ে সেগুলি সেট করার দরকার নেই, আপনি কেবল অ-ডিফল্ট নির্দিষ্ট করতে পারেন। প্রসারিত পদ্ধতির জন্য, আপনি jQuery এর প্রসারিত পদ্ধতি ( $.extend()
) ব্যবহার করতে পারেন , নিজের নিজস্ব কারুকাজ করতে পারেন বা নিম্নলিখিত ব্যবহার করতে পারেন:
function extend() {
for (var i = 1; i < arguments.length; i++)
for (var key in arguments[i])
if (arguments[i].hasOwnProperty(key))
arguments[0][key] = arguments[i][key];
return arguments[0];
}
এটি কনফেক্সট অবজেক্টটিকে ডিফল্টের সাথে একীভূত করবে এবং আপনার অবজেক্টের কোনও অপরিবর্তিত মান ডিফল্টর সাথে পূরণ করবে।
_.defaults()
নির্দিষ্ট এবং ডিফল্ট আর্গুমেন্টগুলিকে মার্জ করার জন্য ইন্ডসকোরের পদ্ধতিটি একটি দুর্দান্ত বিকল্প।
রামাস্ট নির্দেশিত হিসাবে বিশ্রামের প্যারামিটার সিনট্যাক্স ব্যবহার করা ভাল।
function (a, b, ...args) {}
আমি ঠিক ... যুক্তি যুক্তির কিছু দুর্দান্ত সম্পত্তি যুক্ত করতে চাই
- এটি একটি অ্যারে, এবং আর্গুমেন্টের মতো কোনও বস্তু নয়। এটি আপনাকে মানচিত্রের মতো ফাংশন প্রয়োগ করতে বা সরাসরি বাছাই করতে সহায়তা করে।
- এটিতে সমস্ত পরামিতি অন্তর্ভুক্ত নয় তবে কেবল এটির মধ্য দিয়ে পাস হয়েছে। উদাহরণস্বরূপ ফাংশন (ক, খ, ... আরগস) এ ক্ষেত্রে আর্গুমেন্টে তিনটি যুক্তি রয়েছে le দৈর্ঘ্য
ইতিমধ্যে উল্লিখিত হিসাবে, আপনি এটি ব্যবহার করতে পারেন arguments
ফাংশন প্যারামিটারগুলির একটি পরিবর্তনশীল সংখ্যক পুনরুদ্ধার অবজেক্টটি ।
আপনি যদি একই যুক্তি দিয়ে অন্য ফাংশনটিতে কল করতে চান তবে ব্যবহার করুন apply
। এমনকি আপনি arguments
অ্যারেতে রূপান্তর করে যুক্তি যুক্ত বা সরাতে পারেন । উদাহরণস্বরূপ, এই ফাংশনটি কনসোলটিতে লগ ইন করার আগে কিছু পাঠ্য সন্নিবেশ করায়:
log() {
let args = Array.prototype.slice.call(arguments);
args = ['MyObjectName', this.id_].concat(args);
console.log.apply(console, args);
}
যদিও আমি সাধারণত স্বীকার করি যে নামযুক্ত আর্গুমেন্ট পদ্ধতির ব্যবহার কার্যকর এবং নমনীয় (যদি না আপনি অর্ডারটির বিষয়ে চিন্তা করেন তবে এই ক্ষেত্রে আর্গুমেন্ট সহজতর) তবে আমার এমবিএসলে পদ্ধতির ব্যয় (ডিফল্ট এবং প্রসারিত ব্যবহার) সম্পর্কে উদ্বেগ রয়েছে। এটি ডিফল্ট মানগুলি টানতে ব্যয় করার একটি চূড়ান্ত পরিমাণ। প্রথমত, ডিফল্টগুলি ফাংশনের অভ্যন্তরে সংজ্ঞায়িত করা হয়, সুতরাং সেগুলি প্রতিটি কলে পুনরায় সঞ্চিত হয়। দ্বিতীয়ত, আপনি সহজেই নামকৃত মানগুলি পড়তে পারেন এবং একই সাথে || ব্যবহার করে ডিফল্ট সেট করতে পারেন। এই তথ্যটি পেতে আরও একটি নতুন অবজেক্ট তৈরি এবং মার্জ করার দরকার নেই।
function load(context) {
var parameter1 = context.parameter1 || defaultValue1,
parameter2 = context.parameter2 || defaultValue2;
// do stuff
}
এটি প্রায় একই পরিমাণের কোড (সম্ভবত কিছুটা বেশি) তবে রানটাইম ব্যয়ের একটি ভগ্নাংশ হওয়া উচিত।
(parameter1=context.parameter1)===undefined && (parameter1=defaultValue1)
বা কম কোড ভলিউমের জন্য একটি ছোট সহায়ক সহায়ক ফাংশন: function def(providedValue, default) {return providedValue !== undefined ? providedValue : defaultValue;} var parameter1 = def(context.parameter1, defaultValue1)
বিকল্প নিদর্শন সরবরাহ করুন। তবে, আমার বক্তব্যটি এখনও দাঁড়িয়েছে: প্রতিটি ফাংশন অনুরোধের জন্য অতিরিক্ত অবজেক্ট তৈরি করা এবং বেশ কয়েকটি ডিফল্ট মান নির্ধারণের জন্য ব্যয়বহুল লুপগুলি চালানো ওভারহেডের পাগল।
@ আরফাম্যাটিকরা আর্গুমেন্ট কীওয়ার্ডটি ব্যবহার করে দেখিয়েছিলেন এবং @ কেন ব্যবহারের জন্য কোনও অবজেক্টের দুর্দান্ত উদাহরণ দেখিয়েছে বলে আমি মনে করি না যে এই পরিস্থিতিতে যা ঘটছে তা সত্যই আমি সম্বোধন করেছি এবং ভবিষ্যতের পাঠককে বিভ্রান্ত করতে পারি বা কোনও খারাপ অভ্যাস প্ররোচিত করতে পারি যাতে কোনও ফাংশন স্পষ্টভাবে উল্লেখ করা হয় না / পদ্ধতিটি আর্গুমেন্ট / পরামিতিগুলির একটি পরিবর্তনশীল পরিমাণ গ্রহণ করার উদ্দেশ্যে।
function varyArg () {
return arguments[0] + arguments[1];
}
যখন অন্য কোনও বিকাশকারী আপনার কোডটি সন্ধান করছেন তখন অনুমান করা খুব সহজ যে এই ফাংশনটি প্যারামিটার নেয় না। বিশেষত যদি সেই বিকাশকারী যুক্তিগুলিতে গোপন না হয় কীওয়ার্ডটি । এ কারণে স্টাইলের গাইডলাইনটি অনুসরণ করা এবং ধারাবাহিক হওয়া ভাল ধারণা। আমি সমস্ত উদাহরণের জন্য গুগল ব্যবহার করব।
আসুন স্পষ্টভাবে একই ফাংশনটির ভেরিয়েবল প্যারামিটার রয়েছে:
function varyArg (var_args) {
return arguments[0] + arguments[1];
}
এমন অনেক সময় থাকতে পারে যখন কোনও অ্যাটাকের প্রয়োজন হয় কারণ এটি কোনও ডেটা ম্যাপের একমাত্র অনুমোদিত এবং বিবেচিত সেরা অনুশীলন পদ্ধতি। সহযোগী অ্যারেগুলি হতাশ এবং নিরুৎসাহিত করা হয়।
সাইড নোট: আর্গুমেন্ট কীওয়ার্ডটি আসলে কী হিসাবে সংখ্যা ব্যবহার করে কোনও বস্তুকে ফিরিয়ে দেয়। প্রোটোটাইপাল উত্তরাধিকার হ'ল অবজেক্ট পরিবার। জেএসে সঠিক অ্যারে ব্যবহারের জন্য উত্তরের শেষটি দেখুন
এই ক্ষেত্রে আমরা স্পষ্টভাবে এটিও বলতে পারি। দ্রষ্টব্য: এই নামকরণ কনভেনশনটি গুগল সরবরাহ করে না তবে এটি একটি পরমের ধরণের স্পষ্ট ঘোষণার উদাহরণ। আপনি যদি আপনার কোডটিতে আরও কঠোর টাইপ করা প্যাটার্ন তৈরি করতে চান তবে এটি গুরুত্বপূর্ণ।
function varyArg (args_obj) {
return args_obj.name+" "+args_obj.weight;
}
varyArg({name: "Brian", weight: 150});
এটি আপনার ফাংশন এবং প্রোগ্রামের প্রয়োজনের উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি কেবলমাত্র সমস্ত আর্গুমেন্ট পেরিয়ে একটি পুনরাবৃত্ত প্রক্রিয়াতে একটি মান বেস ফেরার জন্য সন্ধান করছেন তবে অবশ্যই অবশ্যই আর্গুমেন্ট কীওয়ার্ডের সাথে লেগে থাকুন। আপনার যদি আপনার যুক্তি এবং ডেটা ম্যাপিংয়ের সংজ্ঞা প্রয়োজন হয় তবে অবজেক্ট পদ্ধতিটি যাওয়ার উপায়। আসুন দুটি উদাহরণ দেখুন এবং তারপরে আমাদের কাজ শেষ!
function sumOfAll (var_args) {
return arguments.reduce(function(a, b) {
return a + b;
}, 0);
}
sumOfAll(1,2,3); // returns 6
function myObjArgs(args_obj) {
// MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
if (typeof args_obj !== "object") {
return "Arguments passed must be in object form!";
}
return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
}
myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old
উত্তরের উপরে উল্লিখিত হিসাবে আর্গুমেন্ট কীওয়ার্ডটি আসলে কোনও বস্তু দেয়। এর কারণে আপনি যে কোনও পদ্ধতিতে অ্যারের জন্য ব্যবহার করতে চান তা কল করতে হবে। এর একটি উদাহরণ:
Array.prototype.map.call(arguments, function (val, idx, arr) {});
এটি এড়াতে বাকি প্যারামিটারটি ব্যবহার করুন:
function varyArgArr (...var_args) {
return var_args.sort();
}
varyArgArr(5,1,3); // returns 1, 3, 5
arguments
সমস্ত আর্গুমেন্টে প্রবেশ করার জন্য ফাংশনের অভ্যন্তরে অবজেক্টটি ব্যবহার করুন ।
কেন সচেতন হিসাবে নামযুক্ত বৈশিষ্ট্যযুক্ত কোনও বস্তু পাস করা প্রতিটি কলটিতে অস্থায়ী বস্তু বরাদ্দকরণ এবং ছেড়ে দেওয়ার জন্য ব্যয় যুক্ত করে রাখুন aware মান বা রেফারেন্স দ্বারা সাধারণ আর্গুমেন্ট পাস করা সাধারণত সবচেয়ে দক্ষ হবে। অনেক অ্যাপ্লিকেশনগুলির জন্য যদিও পারফরম্যান্স সমালোচিত নয় তবে কিছুটির জন্য এটি হতে পারে।