আমার দুটি সেন্ট ... এটি আমি এটি বুঝতে পারি। (আমি ভুল হলে আমাকে সংশোধন করতে নির্দ্বিধায়)
মান / রেফারেন্স দিয়ে পাস সম্পর্কে আপনার জানা সমস্ত কিছু ছড়িয়ে দেওয়ার সময়।
কারণ জাভাস্ক্রিপ্টে, এটি মান দ্বারা বা রেফারেন্স বা যা কিছু দ্বারা পাস করা হয়েছে তা বিবেচ্য নয়। কী গুরুত্বপূর্ণ তা হ'ল রূপান্তর বনাম অ্যাসাইনমেন্ট প্যারামিটারগুলিতে একটি ফাংশনে প্রেরণ।
ঠিক আছে, আমার অর্থটি বোঝাতে আমার যথাসাধ্য চেষ্টা করুন। ধরা যাক আপনার কয়েকটি জিনিস রয়েছে।
var object1 = {};
var object2 = {};
আমরা যা করেছি তা হ'ল "অ্যাসাইনমেন্ট" ... আমরা ভেরিয়েবল "অবজেক্ট 1" এবং "অবজেক্ট 2" তে 2 টি পৃথক খালি বস্তু বরাদ্দ করেছি।
এখন, ধরুন যে আমরা অবজেক্ট 1 আরও ভাল পছন্দ করি ... সুতরাং, আমরা একটি নতুন ভেরিয়েবল "অর্পণ" করি।
var favoriteObject = object1;
এরপরে, যে কারণেই হোক না কেন, আমরা স্থির করি যে আমরা 2 টির চেয়ে ভাল জিনিস পছন্দ করি। সুতরাং, আমরা কেবল একটি সামান্য পুনরায় নিয়োগ করা।
favoriteObject = object2;
অবজেক্ট 1 বা অবজেক্ট 2 এর কিছুই হয়নি। আমরা মোটেই কোনও ডেটা পরিবর্তন করি নি। আমরা যা করেছি তা হ'ল আমাদের প্রিয় বস্তুটি কী তা পুনরায় বরাদ্দ করা হয়েছিল। এটি জেনে রাখা গুরুত্বপূর্ণ যে অবজেক্ট 2 এবং প্রিয়অবজেক্ট উভয়ই একই বস্তুর জন্য নির্ধারিত। আমরা সেই ভেরিয়েবলের যে কোনওটির মাধ্যমে সেই বস্তুটি পরিবর্তন করতে পারি।
object2.name = 'Fred';
console.log(favoriteObject.name) // Logs Fred
favoriteObject.name = 'Joe';
console.log(object2.name); // Logs Joe
ঠিক আছে, এখন উদাহরণস্বরূপ স্ট্রিংয়ের মতো আদিম দিকে নজর দিন
var string1 = 'Hello world';
var string2 = 'Goodbye world';
আবার, আমরা একটি প্রিয় বাছাই।
var favoriteString = string1;
আমাদের প্রিয় স্ট্রিং এবং স্ট্রিং 1 ভ্যারিয়েবল উভয়ই 'হ্যালো ওয়ার্ল্ড' এ নিয়োগ করা হয়েছে। এখন, আমরা যদি আমাদের প্রিয় স্ট্রিংটি পরিবর্তন করতে চাই তবে ??? কি হবে???
favoriteString = 'Hello everyone';
console.log(favoriteString); // Logs 'Hello everyone'
console.log(string1); // Logs 'Hello world'
আহা .... কি হয়েছে। আমরা স্ট্রিং 1 পরিবর্তন করে ফেভারিট স্ট্রিং পরিবর্তন করতে পারিনি ... কেন ?? কারণ আমরা আমাদের স্ট্রিং অবজেক্টটি পরিবর্তন করি নি । আমরা কেবল "আরএসজিএন" করেছি নতুন স্ট্রিংয়ের প্রিয় স্ট্রিং পরিবর্তনশীল vari এটি স্ট্রিং 1 থেকে মূলত এটি সংযোগ বিচ্ছিন্ন করে। পূর্ববর্তী উদাহরণে, যখন আমরা আমাদের অবজেক্টটির নামকরণ করেছি, আমরা কোনও কিছু বরাদ্দ করি নি। (ভাল, ভেরিয়েবলটি নিজেই নয় , আমরা তবে নামের নতুন সম্পত্তিটিকে একটি নতুন স্ট্রিংয়ে অর্পণ করেছি)) পরিবর্তে আমরা কেবলমাত্র সেই বস্তুকে রূপান্তরিত করি যা 2 ভেরিয়েবল এবং অন্তর্নিহিত বস্তুর মধ্যে সংযোগ রাখে। (এমনকি যদি আমরা স্ট্রিং অবজেক্টটিকে নিজেই পরিবর্তন বা পরিবর্তন করতে চাইতাম, আমরা থাকতে পারিনি, কারণ স্ট্রিংগুলি জাভাস্ক্রিপ্টে আসলে পরিবর্তনযোগ্য)
এখন, ফাংশনগুলি এবং প্যারামিটারগুলি পাশ করার জন্য .... আপনি যখন কোনও ফাংশন কল করেন এবং একটি প্যারামিটারটি পাস করেন, আপনি মূলত যা করছেন তা একটি নতুন ভেরিয়েবলের "অ্যাসাইনমেন্ট", এবং এটি ঠিক একইভাবে কাজ করে যদি আপনি কেবল ব্যবহার করে নির্ধারিত হন সমান (=) চিহ্ন।
এই উদাহরণগুলি গ্রহণ করুন।
var myString = 'hello';
// Assign to a new variable (just like when you pass to a function)
var param1 = myString;
param1 = 'world'; // Re assignment
console.log(myString); // Logs 'hello'
console.log(param1); // Logs 'world'
এখন, একই জিনিস, কিন্তু একটি ফাংশন দিয়ে
function myFunc(param1) {
param1 = 'world';
console.log(param1); // Logs 'world'
}
var myString = 'hello';
// Calls myFunc and assigns param1 to myString just like param1 = myString
myFunc(myString);
console.log(myString); // logs 'hello'
ঠিক আছে, এখন এর পরিবর্তে অবজেক্ট ব্যবহার করে কয়েকটি উদাহরণ দেওয়া যাক ... প্রথমে ফাংশন ছাড়াই।
var myObject = {
firstName: 'Joe',
lastName: 'Smith'
};
// Assign to a new variable (just like when you pass to a function)
var otherObj = myObject;
// Let's mutate our object
otherObj.firstName = 'Sue'; // I guess Joe decided to be a girl
console.log(myObject.firstName); // Logs 'Sue'
console.log(otherObj.firstName); // Logs 'Sue'
// Now, let's reassign the variable
otherObj = {
firstName: 'Jack',
lastName: 'Frost'
};
// Now, otherObj and myObject are assigned to 2 very different objects
// And mutating one object has no influence on the other
console.log(myObject.firstName); // Logs 'Sue'
console.log(otherObj.firstName); // Logs 'Jack';
এখন, একই জিনিস, কিন্তু একটি ফাংশন কল সঙ্গে
function myFunc(otherObj) {
// Let's mutate our object
otherObj.firstName = 'Sue';
console.log(otherObj.firstName); // Logs 'Sue'
// Now let's re-assign
otherObj = {
firstName: 'Jack',
lastName: 'Frost'
};
console.log(otherObj.firstName); // Logs 'Jack'
// Again, otherObj and myObject are assigned to 2 very different objects
// And mutating one object doesn't magically mutate the other
}
var myObject = {
firstName: 'Joe',
lastName: 'Smith'
};
// Calls myFunc and assigns otherObj to myObject just like otherObj = myObject
myFunc(myObject);
console.log(myObject.firstName); // Logs 'Sue', just like before
ঠিক আছে, আপনি যদি এই পুরো পোস্টটি পড়ে থাকেন তবে সম্ভবত এখন জাভাস্ক্রিপ্টে ফাংশন কলগুলি কীভাবে কাজ করে সে সম্পর্কে আপনার আরও ভাল ধারণা রয়েছে। কিছু রেফারেন্স বা মান দ্বারা পাস করা হয়েছে কিনা তা বিবেচ্য নয় ... যা গুরুত্বপূর্ণ বিষয়টি বনাম রূপান্তর।
প্রতিবার আপনি কোনও ফাংশনে কোনও ভেরিয়েবল পাস করার সময়, আপনি প্যারামিটার ভেরিয়েবলের নাম যাই হোক না কেন "অ্যাসাইনিং" করছেন ঠিক যেমন আপনি সমান (=) চিহ্ন ব্যবহার করেছেন।
সর্বদা মনে রাখবেন যে সমান চিহ্ন (=) এর অর্থ অ্যাসাইনমেন্ট। সর্বদা মনে রাখবেন যে জাভাস্ক্রিপ্টের কোনও ফাংশনে একটি প্যারামিটার পাস করার অর্থ অ্যাসাইনমেন্ট means এগুলি একই এবং 2 টি ভেরিয়েবলগুলি ঠিক একইভাবে সংযুক্ত রয়েছে (যার অর্থ হল তারা না হয়, যদি না আপনি গণনা করেন যে তারা একই বস্তুকে বরাদ্দ করা হয়েছে)।
অন্তর্নিহিত অবজেক্টটি রূপান্তরিত হওয়ার পরে কেবলমাত্র "ভেরিয়েবলকে সংশোধন করা" ভিন্ন ভেরিয়েবলকে প্রভাবিত করে (সেই ক্ষেত্রে আপনি ভেরিয়েবলটি পরিবর্তন করেননি, তবে বস্তু নিজেই itself
বস্তু এবং আদিমগুলির মধ্যে পার্থক্য করার কোনও অর্থ নেই, কারণ এটি ঠিক একইভাবে কাজ করে যেমন আপনার কোনও ফাংশন নেই এবং একটি নতুন ভেরিয়েবলকে বরাদ্দ করার জন্য কেবল সমান চিহ্নটি ব্যবহার করেছেন।
একমাত্র গোটচা যখন আপনি ফাংশনে প্রবেশ করে তার চলকটির নামটি ফাংশন প্যারামিটারের নামের সাথে একই। যখন এটি ঘটে তখন আপনাকে ফাংশনের অভ্যন্তরের প্যারামিটারটি এমন আচরণ করতে হবে যেন এটি কোনও সম্পূর্ণ নতুন ভেরিয়েবলটি ব্যক্তিগত হয়ে থাকে (কারণ এটি)
function myFunc(myString) {
// myString is private and does not affect the outer variable
myString = 'hello';
}
var myString = 'test';
myString = myString; // Does nothing, myString is still 'test';
myFunc(myString);
console.log(myString); // Logs 'test'