জাভাস্ক্রিপ্ট কি কোনও পাস-বাই-রেফারেন্স বা পাস-বাই-ভ্যালু ভাষা?


1403

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

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


2
আমি মনে করি আপনি দুর্ঘটনাক্রমে পাস-বাই-মান এবং রেস-রেফারেন্সের সংজ্ঞাটি সংশোধন করেছেন ... "পাস-বাই-ভ্যালু (যদি আমরা বিবেচনা করি যে কোনও বস্তুর ধারণকারী একটি ভেরিয়েবল আসলে অবজেক্টের একটি রেফারেন্স হয়) এবং উত্তীর্ণ হয়েছিল -দ্বারা-রেফারেন্স (যখন আমরা বিবেচনা করি যে বস্তুর ভেরিয়েবলটি বস্তুটিকে ধারণ করে) "
নিকো বেলিক

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

5
এই পুরানো প্রশ্নটি কিছুটা বিষাক্ত কারণ এর ভারী-আপভোয়েটেড উত্তরটি ভুল। জাভাস্ক্রিপ্ট কঠোরভাবে পাস-বাই-মান
পয়েন্টটি

6
@ ডানাইলনাচেভ এই পরিভাষাটি দুঃখজনকভাবে বিভ্রান্তিকর। বিষয়টি হ'ল, "মান দ্বারা পাস" এবং "রেফারেন্স দ্বারা পাস" এমন পদগুলি যা আরও অনেক আধুনিক প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলির পূর্বাভাস দেয়। "মান" এবং "রেফারেন্স" শব্দগুলি বিশেষত প্যারামিটারকে উল্লেখ করে কারণ এটি ফাংশন কল এক্সপ্রেশনটিতে উপস্থিত হয়। ফাংশন কল করার আগে জাভাস্ক্রিপ্ট সর্বদা ফাংশন কল প্যারামিটার তালিকার প্রতিটি অভিব্যক্তি মূল্যায়ন করে , তাই পরামিতিগুলি সর্বদা মান। বিভ্রান্তিকর অংশটি হ'ল বস্তুর উল্লেখগুলি জাভাস্ক্রিপ্টের সাধারণ মান। তবে এটি ভাষাটিকে "রেফারেন্স দ্বারা পাস" করে তোলে না।
পয়েন্টটি

2
@ ডানাইলনাচেভ "রেফারেন্স দ্বারা পাস" এর অর্থ নির্দিষ্টভাবে করা হয় যে আপনার যদি var x=3, y=x; f(x); alert(y === x);তখন কাজ করে থাকে তবে f()সতর্কতা প্রতিবেদন তৈরি করতে পারে falseএবং নাও true। জাভাস্ক্রিপ্টে, এটি সম্ভব নয়, সুতরাং এটি পাস-বাই-রেফারেন্স নয়। এটি ভাল যে পরিবর্তনযোগ্য অবজেক্টের রেফারেন্সগুলি পাস করা সম্ভব, তবে "রেফারেন্স বাই পাস" এর অর্থ এটি নয়। আমি যেমন বলেছিলাম, এটি লজ্জার বিষয় যে পরিভাষাটি এত বিভ্রান্তিকর।
পয়েন্টটি

উত্তর:


1596

এটি জাভাস্ক্রিপ্টে আকর্ষণীয়। এই উদাহরণ বিবেচনা করুন:

function changeStuff(a, b, c)
{
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);
console.log(obj2.item);

এটি আউটপুট উত্পাদন করে:

10
changed
unchanged
  • যদি obj1আদৌ কোনও রেফারেন্স না হয়, তবে পরিবর্তনের ফলে ফাংশনের বাইরের obj1.itemকোনও প্রভাব পড়বে না obj1
  • যুক্তি যদি যথাযথ রেফারেন্স হত তবে সবকিছু বদলে যেত। numহবে 100, এবং obj2.itemপড়তে হবে "changed"

পরিবর্তে, পরিস্থিতিটি হল যে পাস করা আইটেমটি মান দ্বারা পাস করা হয়। তবে মান দ্বারা পাস করা আইটেমটি নিজেই একটি উল্লেখ reference প্রযুক্তিগতভাবে, একে কল-বাই ভাগ করে নেওয়া বলে

ব্যবহারিক ভাষায়, এর অর্থ এই যে আপনি যদি প্যারামিটারটি নিজেই পরিবর্তন করেন (যেমন numএবং পাশাপাশি obj2) তবে এটি প্যারামিটারে খাওয়ানো আইটেমটিকে প্রভাবিত করবে না। তবে আপনি যদি প্যারামিটারের ইন্টারনালগুলি পরিবর্তন করেন তবে এটি ব্যাক আপ প্রচার করবে (যেমন রয়েছে obj1)।


32
এটি সি # এর মতো হুবহু (বা অন্তত শব্দার্থভাবে)। বস্তুর দুটি প্রকার রয়েছে: মান (আদিম ধরণের) এবং রেফারেন্স।
পিটার লি

53
আমি মনে করি এটি জাভাতেও ব্যবহৃত হয়: রেফারেন্স-বাই-মান।
জেপ্নি

295
আসল কারণটি হ'ল চেঞ্জস্টফের মধ্যে নাম্বার, অজেক্ট 1 এবং অজাব 2 রেফারেন্স। আপনি যখন itemاعتراض 1 দ্বারা রেফারেন্সযুক্ত বস্তুর সম্পত্তি পরিবর্তন করবেন, আপনি মূলত "অপরিবর্তিত" হিসাবে সেট করা আইটেমের সম্পত্তিটির মান পরিবর্তন করছেন। যখন আপনি 2 আইটেমটির একটি মান: "পরিবর্তিত" assign যখন আপনি অর্পণ করেন} আপনি কোনও নতুন অবজেক্টের রেফারেন্স পরিবর্তন করছেন (যা তত্ক্ষণাত সুযোগ থেকে বাইরে চলে গেলে ফাংশনটি বেরিয়ে যায়)। আপনি যদি ফাংশনটির নামগুলি, নাম্বার, আইজে 1 এফ এবং আইজে 2 এফের মতো জিনিসগুলির নাম দেন তবে এটি ঘটছে তা আরও প্রকট হয়ে ওঠে। তারপরে আপনি দেখতে পাচ্ছেন যে পরমগুলি বাহ্যিক বর্ণের নামগুলি গোপন করেছিল।
জিঙ্গলেস্টুলা

13
পুনঃটুইট আপনি যা চান তা হ'ল রেফারেন্সটিকে রেফারেন্স দিয়ে মান দ্বারা রেফারেন্সের পরিবর্তে পাস করুন। তবে জাভাস্ক্রিপ্ট সর্বদা মান অনুসারে রেফারেন্সটি পাস করে, যেমন এটি মূল্য দিয়ে অন্য সমস্ত কিছু পাস করে। (তুলনা করার জন্য, সি # এর জাভাস্ক্রিপ্ট এবং জাভার অনুরূপ পাস-রেফারেন্স-বাই-মান আচরণ রয়েছে, তবে আপনাকে refকীওয়ার্ড সহ পাস-রেফারেন্স-বাই-রেফারেন্স নির্দিষ্ট করতে দেয় )) সাধারণত আপনার কেবলমাত্র ফাংশনটি নতুন অবজেক্টটি ফিরিয়ে আনতে হবে এবং করতে হবে আপনি যে ফাংশনটি কল করবেন সেই বিন্দুতে অ্যাসাইনমেন্ট। উদাহরণস্বরূপfoo = GetNewFoo();GetNewFoo(foo);
টিম গুডম্যান

55
যদিও এই উত্তরটি সর্বাধিক জনপ্রিয় তবে এটি কিছুটা বিভ্রান্তিকর হতে পারে কারণ এটি "যদি এটি মূল্য দিয়ে বিশুদ্ধ পাস হয়" বলে উল্লেখ করে। জাভাস্ক্রিপ্ট হয় বিশুদ্ধ পাস-বাই-মান। তবে যে মানটি পাস হয় তা হল একটি রেফারেন্স। এটি মোটেও প্যারামিটার-পাসিংয়ের জন্য সীমাবদ্ধ নয়। আপনি কেবল এই দ্বারা পরিবর্তনশীল অনুলিপি var obj1 = { item: 'unchanged' }; var obj2 = obj1; obj2.item = 'changed';করতে পারেন এবং আপনার উদাহরণ হিসাবে একই প্রভাব পর্যবেক্ষণ করবে। অতএব আমি ব্যক্তিগতভাবে টিম গুডম্যানের উত্তরটি উল্লেখ করি
চিককোডোরো

475

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

উদাহরণ:

function changeObject(x) {
  x = { member: "bar" };
  console.log("in changeObject: " + x.member);
}

function changeMember(x) {
  x.member = "bar";
  console.log("in changeMember: " + x.member);
}

var x = { member: "foo" };

console.log("before changeObject: " + x.member);
changeObject(x);
console.log("after changeObject: " + x.member); /* change did not persist */

console.log("before changeMember: " + x.member);
changeMember(x);
console.log("after changeMember: " + x.member); /* change persists */

আউটপুট:

before changeObject: foo
in changeObject: bar
after changeObject: foo

before changeMember: foo
in changeMember: bar
after changeMember: bar

14
@ দিবালোক: আসলে, আপনি ভুল যদি কনস্টের মাধ্যমে এটি পাস করে চেঞ্জঅবজেক্ট করার চেষ্টা করা হয় তবে ব্যর্থ হওয়ার চেয়ে ত্রুটি ঘটবে cause সি ++ তে একটি কনস্ট্যান্ড রেফারেন্সে একটি নতুন মান নির্ধারণের চেষ্টা করুন এবং সংকলক এটি প্রত্যাখ্যান করে। ব্যবহারকারীর ভাষায়, এটি মান দ্বারা পাস এবং কনস্টের রেফারেন্স দ্বারা পাসের মধ্যে পার্থক্য।
ডিফোর্ড

5
@ দিবালোক: এটি ধ্রুবক রেফ নয়। ইন changeObject, আমি xনতুন অবজেক্টের একটি রেফারেন্স ধারণ করে পরিবর্তন করেছি । আমি যা বলছি x = {member:"bar"};তার সমতুল্য, x = new Object(); x.member = "bar";যাইহোক, সি # এর ক্ষেত্রেও সত্য।
টিম গুডম্যান

2
@daylight: C # এর জন্য, আপনি ফাংশন বাইরে থেকে দেখতে পারে, যদি আপনি ব্যবহার refশব্দ আপনি রেফারেন্স (মান দ্বারা রেফারেন্স ক্ষণস্থায়ী ডিফল্ট পরিবর্তে) দ্বারা রেফারেন্স প্রেরণ করতে পারেন, এবং তারপর একটি বিন্দু পরিবর্তন new Object() হবে জিদ ।
টিম গুডম্যান

11
@ অ্যাডটিয়ামনন "কেন" এর উত্তর দেওয়া শক্ত, তবে আমি লক্ষ করব যে জাভা এবং সি # এর ডিজাইনাররা একই রকম পছন্দ করেছেন; এটি কেবল কিছু জাভাস্ক্রিপ্ট অদ্ভুততা নয়। সত্যই, এটি খুব ধারাবাহিকভাবে পাস-বাই-ভ্যালু, জিনিসটি এটি মানুষের জন্য বিভ্রান্তিকর করে তোলে তা হল একটি মান একটি রেফারেন্স হতে পারে। এটি সি ++ তে (মান অনুসারে) চারপাশে একটি পয়েন্টার পাস করার পরে এবং সদস্যদের সেট করার জন্য এটিকে অবনমিত করার চেয়ে আলাদা নয়। যে পরিবর্তন অব্যাহত আছে কেউ অবাক হবে না। তবে এই ভাষাগুলি নির্দেশককে বিমূর্ত করে তোলে এবং নিঃশব্দে আপনার জন্য ডেরিফারেন্সিং করে, মানুষ বিভ্রান্ত হয়।
টিম গুডম্যান

41
অন্য কথায়, এখানে বিভ্রান্তিকর জিনিসটি পাস-বাই-মান / পাস-বাই-রেফারেন্স নয় isn't সমস্ত কিছুই পাস-বাই-ভ্যালু, ফুল স্টপ। বিভ্রান্তকর বিষয় হ'ল আপনি কোনও বস্তুটি পাস করতে পারবেন না এবং আপনি কোনও ভেরিয়েবলে কোনও জিনিস সংরক্ষণ করতে পারবেন না। যতবার আপনি মনে করেন আপনি এটি করছেন, আপনি আসলে সেই বস্তুর একটি রেফারেন্স পাস করছেন বা সঞ্চয় করছেন । তবে আপনি যখন এর সদস্যদের অ্যাক্সেস করতে যান, তখন একটি নীরব ডেরিফারেন্সিং ঘটে যা ঘটে যায়, যা আপনার পরিবর্তনশীল প্রকৃত অবজেক্টটিকে ধারণ করে এমন কথাসাহিত্যকে স্থায়ী করে দেয়।
টিম গুডম্যান

150

ভেরিয়েবল বস্তুটিকে "ধরে" রাখে না; এটি একটি রেফারেন্স ধারণ করে। আপনি সেই রেফারেন্সটিকে অন্য ভেরিয়েবলের জন্য বরাদ্দ করতে পারেন, এবং এখন উভয়ই একই বস্তুর রেফারেন্স করতে পারেন। এটি সর্বদা মান দ্বারা পাস হয় (এমনকি যখন সেই মানটি একটি রেফারেন্স হয় ...)।

কোনও প্যারামিটার হিসাবে ভেরিয়েবল দ্বারা গৃহীত মান পরিবর্তন করার কোনও উপায় নেই, যা জাভাস্ক্রিপ্ট যদি রেফারেন্স দ্বারা পাস করার পক্ষে সমর্থন করে।


2
এটি আমাকে কিছুটা বিভ্রান্ত করে। একটি রেফারেন্স পাস-রেফারেন্স পাস না?

8
লেখকটির অর্থ হ'ল একটি রেফারেন্স পাস করার মাধ্যমে আপনি একটি রেফারেন্স মানটি পাস করছেন (এটির ভাবনার আর একটি উপায় যা মেমরি ঠিকানার মানটি পার করছে)। সুতরাং আপনি যদি বস্তুটিকে পুনরায় ঘোষণা করেন তবে মূলটি পরিবর্তন হয় না কারণ আপনি একটি ভিন্ন মেমরির স্থানে একটি নতুন অবজেক্ট তৈরি করছেন। আপনি যদি কোনও সম্পত্তি পরিবর্তন করেন তবে আসল অবজেক্টটি পরিবর্তিত হয় কারণ আপনি এটির মূল মেমরির অবস্থানে পরিবর্তন করেছেন (এটি পুনরায় নিযুক্ত করা হয়নি)।
হুই-আনহ হোয়াং

113

আমার দুটি সেন্ট ... এটি আমি এটি বুঝতে পারি। (আমি ভুল হলে আমাকে সংশোধন করতে নির্দ্বিধায়)

মান / রেফারেন্স দিয়ে পাস সম্পর্কে আপনার জানা সমস্ত কিছু ছড়িয়ে দেওয়ার সময়।

কারণ জাভাস্ক্রিপ্টে, এটি মান দ্বারা বা রেফারেন্স বা যা কিছু দ্বারা পাস করা হয়েছে তা বিবেচ্য নয়। কী গুরুত্বপূর্ণ তা হ'ল রূপান্তর বনাম অ্যাসাইনমেন্ট প্যারামিটারগুলিতে একটি ফাংশনে প্রেরণ।

ঠিক আছে, আমার অর্থটি বোঝাতে আমার যথাসাধ্য চেষ্টা করুন। ধরা যাক আপনার কয়েকটি জিনিস রয়েছে।

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'

2
যে কোনও সি প্রোগ্রামারদের জন্য, চর * ভাবেন। foo(char *a){a="hello";} কিছুই করে না, তবে আপনি যদি foo(char *a){a[0]='h';a[1]='i';a[2]=0;}এটি করেন তবে এটি বাইরে পরিবর্তন করা হয়েছে কারণ aএকটি স্ট্রিং (চর অ্যারে) উল্লেখ করে মান দ্বারা পাস করা একটি মেমরি অবস্থান। সিতে মান দ্বারা স্ট্রাক্টগুলি (জেএস অবজেক্টের অনুরূপ) পাস করার অনুমতি দেওয়া হলেও এটি প্রস্তাবিত নয়। জাভাস্ক্রিপ্ট সহজেই এই সেরা অনুশীলনগুলি প্রয়োগ করে এবং অপ্রয়োজনীয় এবং সাধারণত অনাকাঙ্ক্ষিত ক্রাফ্টটি গোপন করে ... এবং এটি নিশ্চিতভাবে সহজ পাঠের ব্যবস্থা করে।
টেকনোসরাস 26'15

2
এটি সঠিক - প্রোগ্রামিং ভাষার নকশায় পাস-বাই-মান এবং পাস-বাই-রেফারেন্সের অর্থ রয়েছে এবং এই অর্থগুলির সাথে অবজেক্ট মিউটেশনের কোনও মিল নেই। ফাংশন প্যারামিটারগুলি কীভাবে কাজ করে সে সম্পর্কে এটি সমস্ত।
পয়েন্টটি

2
এখন যেহেতু আমি বুঝতে পারি যেজেজ 1 = আপজি 2 এর অর্থ হ'ল অ্যাজ 1 এবং অজেজ 2 এখন একই রেফারেন্স অবস্থানটির দিকে ইশারা করছে, এবং যদি আমি অজ 2 এর ইন্টার্নালগুলি সংশোধন করি তবে অ্যাজজ 1 এর উল্লেখ একই ইন্টার্নালগুলি প্রকাশ করবে। আমি কীভাবে এমন কোনও বিষয়টিকে অনুলিপি করব যে যখন আমি source = { "id":"1"}; copy = source /*this is wrong*/; copy.id="2"সেই উত্সটি করি তখনও {"আইডি": "1"}?
ম্যাক্টিন

1
আশাবাদী বিভ্রান্তি কমাতে আমি চিরায়ত সংজ্ঞা সহ আরও একটি উত্তর পোস্ট করেছি posted "পাস-বাই-ভ্যালু" এবং "পাস-বাই-রেফারেন্স" এর ditionতিহ্যবাহী সংজ্ঞাগুলি স্বয়ংক্রিয়ভাবে ডেরেফারেন্সের আগে মেমরি পয়েন্টারগুলির দিনে ফিরে সংজ্ঞায়িত হয়েছিল। এটি পুরোপুরি ভালভাবে বোঝা গিয়েছিল যে কোনও অবজেক্ট ভেরিয়েবলের মান হ'ল মেমরি পয়েন্টারের অবস্থান, বস্তু নয়। যদিও আপনার অ্যাসাইনমেন্ট বনাম মিউটেশন সম্পর্কিত আলোচনা সম্ভবত দরকারী, তবে এটি প্রচলিত শর্তাদি বা তাদের সংজ্ঞাগুলি ছুঁড়ে দেওয়ার দরকার নেই। মিউটেশন, অ্যাসাইনমেন্ট, পাস-বাই-ভ্যালু, পাস-বাই-রেফারেন্স ইত্যাদি অবশ্যই একে অপরের বিরোধিতা করবে না।
সি পার্কিনস

"সংখ্যা" কি "অপরিবর্তনীয়"?
ইব্রাম খলিল

72

নিম্নোক্ত বিবেচনা কর:

  1. ভেরিয়েবলগুলি মেমরির মানগুলির জন্য নির্দেশক
  2. একটি ভেরিয়েবলকে পুনরায় সাইন ইন করা কেবলমাত্র সেই পয়েন্টারটিকে একটি নতুন মানকে নির্দেশ করে।
  3. কোনও ভেরিয়েবল পুনরায় সাইন ইন করা কখনই অন্যান্য ভেরিয়েবলগুলিকে প্রভাবিত করবে না যা একই বস্তুটিতে নির্দেশ করছিল

সুতরাং, "রেফারেন্স / মান দ্বারা পাস" সম্পর্কে ভুলে যান "রেফারেন্স / মান দ্বারা পাস" এ আটকাবেন না কারণ:

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

আপনার প্রশ্নের উত্তর দিতে: পয়েন্টারগুলি পাস হয়েছে।


// code
var obj = {
    name: 'Fred',
    num: 1
};

// illustration
               'Fred'
              /
             /
(obj) ---- {}
             \
              \
               1


// code
obj.name = 'George';


// illustration
                 'Fred'


(obj) ---- {} ----- 'George'
             \
              \
               1


// code
obj = {};

// illustration
                 'Fred'


(obj)      {} ----- 'George'
  |          \
  |           \
 { }            1


// code
var obj = {
    text: 'Hello world!'
};

/* function parameters get their own pointer to 
 * the arguments that are passed in, just like any other variable */
someFunc(obj);


// illustration
(caller scope)        (someFunc scope)
           \             /
            \           /
             \         /
              \       /
               \     /
                 { }
                  |
                  |
                  |
            'Hello world'

কিছু চূড়ান্ত মন্তব্য:

  • তা চিন্তা করা যে প্রলুব্ধ প্রিমিটিভের যখন বিশেষ নিয়ম দ্বারা প্রয়োগ করা হয় বস্তু না হয় তবে আদিমগুলি কেবল পয়েন্টার শৃঙ্খলার শেষ হয়।
  • একটি চূড়ান্ত উদাহরণ হিসাবে, বিবেচনা করুন কেন অ্যারে পরিষ্কার করার একটি সাধারণ প্রচেষ্টা আশানুরূপভাবে কাজ করে না।


var a = [1,2];
var b = a;

a = [];
console.log(b); // [1,2]
// doesn't work because `b` is still pointing at the original array

অতিরিক্ত creditণের জন্য ফলো-আপ প্রশ্নসমূহ;) আবর্জনা সংগ্রহ কীভাবে কাজ করে? আমি যদি এক মিলিয়ন {'George', 1}মূল্যবোধের মাধ্যমে ভেরিয়েবলটি চক্র করে রাখি তবে কেবল একবারে সেগুলির মধ্যে একটি ব্যবহার করি, তবে অন্যরা কীভাবে পরিচালিত হবে? এবং যখন আমি অন্য ভেরিয়েবলের মানকে একটি ভেরিয়েবল বরাদ্দ করি তখন কী হয়? আমি কি তখন কোনও পয়েন্টারটির দিকে ইশারা করছি, বা সঠিক অপরেন্ডের পয়েন্টিটির দিকে ইশারা করছি? কি var myExistingVar = {"blah", 42}; var obj = myExistingVar;ফলাফল objনির্দেশ {"blah", 42}, অথবা myExistingVar?
মাইকেল হফম্যান

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

1
@ মিশেলহফম্যান এই জাতীয় 2)কিছু সম্পর্কে var a = b, জাভাস্ক্রিপ্ট পয়েন্টার ব্যবহারের জন্য কোনও ব্যবস্থা সরবরাহ করে না এবং সুতরাং কোনও ভেরিয়েবল কখনই কোনও পয়েন্টারের দিকে নির্দেশ করতে পারে না (যদিও আপনি সিতে পারেন) তবে যদিও অন্তর্নিহিত জাভাস্ক্রিপ্ট ইঞ্জিন নিঃসন্দেহে এগুলি ব্যবহার করে। সুতরাং ... "ডান var a = ba
অপরেন্ডের পয়েন্টিটির

আমি এখানে প্রশ্ন # 1 জিজ্ঞাসা করেছি (ক্রোম সম্পর্কে বিশেষত কারণ প্রতিটি ব্রাউজারে বাস্তবায়ন সম্ভবত আলাদা) স্ট্যাকওভারফ্লো.com/q/42778439/539997 এবং আমি এখনও প্রশ্ন # 2 কীভাবে বানাতে চাই তা চিন্তা করার চেষ্টা করছি। কোন সাহায্য প্রশংসা করা হয়।
মাইকেল হফম্যান

1
"রেফারেন্স / মান দিয়ে পাস" সম্পর্কে ভুলে যাওয়ার দরকার নেই ! এই পদগুলির historicalতিহাসিক অর্থ রয়েছে যা আপনি বর্ণনা করার চেষ্টা করছেন ঠিক তা বর্ণনা করে। যদি আমরা historicalতিহাসিক শর্তাদি এবং সংজ্ঞাগুলি ফেলে দিই এবং সেগুলির মূলত কী বোঝার জন্য খুব অলস হয়ে যায় তবে আমরা প্রজন্মের মধ্যে কার্যকরভাবে যোগাযোগের ক্ষমতা হারাতে পারি। বিভিন্ন ভাষা এবং সিস্টেমের মধ্যে পার্থক্য নিয়ে আলোচনা করার কোনও ভাল উপায় হবে না। পরিবর্তে, নতুন প্রোগ্রামারদের traditionalতিহ্যগত পদগুলি কেন এবং কেন এসেছে সেগুলি শিখতে ও বুঝতে হবে। অন্যথায়, আমরা সম্মিলিতভাবে জ্ঞান এবং বোঝাপড়া হারাতে চাই।
সি পার্কিনস

24

ফাংশনের বাইরের একটি অবজেক্ট বাইরের অবজেক্টের রেফারেন্স দিয়ে একটি ফাংশনে প্রেরণ করা হয়।

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


20

এটি এরকমভাবে ভাবুন: এটি সর্বদা মান দ্বারা পাস হয়। যাইহোক, কোনও সামগ্রীর মান বস্তু নিজেই নয়, তবে সেই বস্তুর একটি রেফারেন্স।

এখানে একটি উদাহরণ দেওয়া হচ্ছে, একটি নম্বর পাস করা (একটি আদিম ধরণ)

function changePrimitive(val) {
    // At this point there are two '10's in memory.
    // Changing one won't affect the other
    val = val * 10;
}
var x = 10;
changePrimitive(x);
// x === 10

এটি কোনও বস্তুর সাথে পুনরাবৃত্তি করা বিভিন্ন ফলাফল দেয়:

function changeObject(obj) {
    // At this point there are two references (x and obj) in memory,
    // but these both point to the same object.
    // changing the object will change the underlying object that
    // x and obj both hold a reference to.
    obj.val = obj.val * 10;
}
var x = { val: 10 };
changeObject(x);
// x === { val: 100 }

আরও একটি উদাহরণ:

function changeObject(obj) {
    // Again there are two references (x and obj) in memory,
    // these both point to the same object.
    // now we create a completely new object and assign it.
    // obj's reference now points to the new object.
    // x's reference doesn't change.
    obj = { val: 100 };
}
var x = { val: 10 };
changeObject(x);
// x === { val: 10}

19

মূল্য এবং রেফারেন্স দ্বারা অনুলিপি করা, পাস করা এবং তুলনা সম্পর্কে খুব বিশদ ব্যাখ্যাটি "জাভাস্ক্রিপ্ট: দ্য সংজ্ঞা নির্দেশিকা" বইয়ের এই অধ্যায়ে রয়েছে ।

আমরা রেফারেন্স দ্বারা অবজেক্টস এবং অ্যারেগুলি পরিচালনা করার বিষয়টি ছেড়ে যাওয়ার আগে আমাদের নামকরণের একটি বিষয় পরিষ্কার করতে হবে।

"রেফারেন্স দ্বারা পাস" বাক্যাংশটির বিভিন্ন অর্থ হতে পারে। কিছু পাঠকের কাছে, শব্দগুচ্ছটি একটি ফাংশন আমন্ত্রণ কৌশল বোঝায় যা একটি ফাংশনকে তার যুক্তিতে নতুন মান নির্ধারণ করতে এবং ফাংশনের বাইরে সেই পরিবর্তিত মানগুলি দৃশ্যমান করতে দেয়। শব্দটি এই বইয়ে ব্যবহৃত হয় না।

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

এই শব্দটির অন্য অর্থের সাথে পরিচিত পাঠকরা বলতে পছন্দ করতে পারেন যে বস্তু এবং অ্যারেগুলি মান দ্বারা পাস হয়, তবে যে মানটি পাস হয় তা আসলে বস্তুর নিজেই নয় বরং একটি রেফারেন্স।


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

16

জাভাস্ক্রিপ্ট সর্বদা মান দ্বারা পাস হয় ; সবকিছু মান ধরণের হয়।

অবজেক্টস হ'ল মান, এবং অবজেক্টের সদস্য ফাংশনগুলি তাদের নিজস্ব মান (মনে রাখবেন যে ফাংশনগুলি জাভাস্ক্রিপ্টে প্রথম শ্রেণীর অবজেক্ট) are এছাড়াও, ধারণা সংক্রান্ত জাভাস্ক্রিপ্ট সবকিছু একটি হল বস্তুর ; এটা ভুল. স্ট্রিং, চিহ্ন, সংখ্যা, বুলিয়ানস, নালস এবং অপরিবর্তিত আদিম

উপলক্ষে তারা তাদের বেস প্রোটোটাইপগুলি থেকে উত্তরাধিকার সূত্রে কিছু সদস্য ফাংশন এবং সম্পত্তি লাভ করতে পারে তবে এটি কেবল সুবিধার জন্য। এর অর্থ এই নয় যে তারা নিজেরাই বস্তু। রেফারেন্সের জন্য নিম্নলিখিত চেষ্টা করুন:

x = "test";
alert(x.foo);
x.foo = 12;
alert(x.foo);

উভয় সতর্কতাগুলিতে আপনি মানটি অপরিজ্ঞাপিত করতে পাবেন।


12
-1, এটি সর্বদা মান দ্বারা পাস হয় না। এমডিসি থেকে: "আপনি যদি কোনও বস্তুর (যেমন একটি অ-আদিম মান, যেমন অ্যারে বা ব্যবহারকারী-সংজ্ঞায়িত অবজেক্ট) প্যারামিটার হিসাবে পাস করেন তবে অবজেক্টের একটি রেফারেন্স ফাংশনে প্রেরণ করা হবে।"
নিক

37
@ নিক: এটি সর্বদা মান দ্বারা পাস হয়। সময়কাল। ফাংশনের মান দ্বারা অবজেক্টের একটি উল্লেখ প্রেরণ করা হয় । এটা রেফারেন্স দিয়ে পাস হয় না। "রেফারেন্স দ্বারা পাস" প্রায় তার ভেরিয়েবলের মান হিসাবে পরিবর্তিত হিসাবে বিবেচনা করা যেতে পারে; ফাংশনটি আর্গুমেন্টে কোনও পরিবর্তন করে (পুরোপুরি একটি পৃথক বস্তুর সাথে এটি প্রতিস্থাপন সহ!) কলারের মধ্যে প্রতিফলিত হবে। শেষ বিটটি জেএসে সম্ভব নয়, কারণ জেএস রেফারেন্স দিয়ে পাস করে না - এটি মান অনুসারে রেফারেন্সগুলি পাস করে। পার্থক্যটি সূক্ষ্ম, তবে এর সীমাবদ্ধতাগুলি বোঝার জন্য গুরুত্বপূর্ণ।
সিএইচও

1
ভবিষ্যতের স্ট্যাকারদের জন্য ... আপনার এই রেফারেন্স সম্পর্কে x = "teste"; x.foo = 12;etc. ইত্যাদি কারণ কেবল কোনও সম্পত্তি স্থির না থাকার অর্থ এটি কোনও বস্তু নয়। এমডিএন যেমন বলে: জাভাস্ক্রিপ্টে প্রায় সবই একটি জিনিস। নাল এবং অপরিজ্ঞাত ব্যতীত সমস্ত আদিম প্রকারগুলিকে অবজেক্ট হিসাবে ধরা হয়। এগুলিকে বৈশিষ্ট্য বরাদ্দ করা যেতে পারে (কিছু ধরণের নির্ধারিত বৈশিষ্ট্য অবিচ্ছিন্ন নয়), এবং তাদের অবজেক্টগুলির সমস্ত বৈশিষ্ট্য রয়েছে। লিঙ্ক
স্ল্যাকট্রেসার

9
MDN একটি ব্যবহারকারী-সম্পাদিত উইকি এবং এটি সেখানে ভুল there আদর্শিক রেফারেন্সটি ইসিএমএ-262। এস। 8 "রেফারেন্স স্পেসিফিকেশন টাইপ" দেখুন, যা উল্লেখগুলি কীভাবে সমাধান করা হয় তা ব্যাখ্যা করে এবং 8.12.5 "[[পুট]]", যা একটি রেফারেন্সের জন্য অ্যাসাইনমেন্টএক্সপ্রেস ব্যাখ্যা করতে ব্যবহৃত হয় এবং 9.9 টোবজেক্ট অবজেক্টের জন্য ব্যবহৃত হয়। আদিম মানগুলির জন্য, মাইকেল ইতিমধ্যে স্পষ্টকরণের মতো টোঅবজেক্ট কী করে তা ব্যাখ্যা করেছে। তবে এস। ৪.৩.২ আদিম মান।
গ্যারেট 18

1
@ ওয়ান্ডারল্যান্ড: না, তিনি নেই। যে সমস্ত মানুষ কখনও রেফারেন্স দিয়ে পাস করতে সক্ষম হননি তারা কখনও রেফারেন্স দিয়ে পাস এবং মান দিয়ে রেফারেন্স পাস করার মধ্যে পার্থক্য বুঝতে পারে না। কিন্তু তারা সেখানে আছে, এবং তারা ব্যাপার। আমি লোককে ভুল তথ্য দেওয়ার পক্ষে যত্ন করি না কারণ এটি আরও সহজ শোনাচ্ছে।
সিএওও

12

জাভাস্ক্রিপ্টে, মানটির ধরণটি পুরোপুরি নিয়ন্ত্রণ করে যে সেই মানটি মূল্য-অনুলিপি দ্বারা বা রেফারেন্স-অনুলিপি দ্বারা নির্ধারিত হবে ।

আদিম মানগুলি সর্বদা মান-অনুলিপি দ্বারা বরাদ্দ / পাস করা হয় :

  • null
  • undefined
  • দড়ি
  • সংখ্যা
  • বুলিয়ান
  • প্রতীক ES6

যৌগিক মানগুলি সর্বদা রেফারেন্স-অনুলিপি দ্বারা বরাদ্দ / পাস করা হয়

  • বস্তু
  • অ্যারে
  • ক্রিয়া

উদাহরণ স্বরূপ

var a = 2;
var b = a; // `b` is always a copy of the value in `a`
b++;
a; // 2
b; // 3

var c = [1,2,3];
var d = c; // `d` is a reference to the shared `[1,2,3]` value
d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]

উপরের স্নিপেটে, কারণ 2এটি একটি স্কেলার আদিম, aসেই মানটির একটি প্রাথমিক অনুলিপি ধারণ করে এবং মানটির bঅন্য একটি অনুলিপি বরাদ্দ করা হয়। পরিবর্তন করার সময় b, আপনি কোনওভাবেই মান পরিবর্তন করতে পারবেন নাa

তবে উভয় cএবং dএকই ভাগ করা মানের পৃথক উল্লেখ [1,2,3], যা একটি যৌগিক মান। এটা খেয়াল করা জরুরী যে অপনি গুরুত্বপূর্ণ cকিংবা dআরো "মালিক" [1,2,3]মান - উভয় মান ঠিক সমান পিয়ার রেফারেন্স আছে। সুতরাং, .push(4)প্রকৃত ভাগ হওয়া arrayমানটি নিজেই সংশোধন করার জন্য (উভয় ) রেফারেন্স ব্যবহার করার সময় , এটি কেবলমাত্র একটি ভাগ করা মানকেই প্রভাবিত করে এবং উভয় উল্লেখই নতুন পরিবর্তিত মানকে রেফারেন্স করবে [1,2,3,4]

var a = [1,2,3];
var b = a;
a; // [1,2,3]
b; // [1,2,3]

// later
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]

যখন আমরা অ্যাসাইনমেন্টটি করি তখন আমরা b = [4,5,6]কোথায় aরেফারেন্স দিচ্ছি তা প্রভাবিত করার জন্য একেবারে কিছুই করছি না ( [1,2,3])। এটি করার জন্য, উল্লেখের পরিবর্তে bপয়েন্টার হতে হবে - তবে জেএসে এ জাতীয় কোনও ক্ষমতা নেই!aarray

function foo(x) {
    x.push( 4 );
    x; // [1,2,3,4]

    // later
    x = [4,5,6];
    x.push( 7 );
    x; // [4,5,6,7]
}

var a = [1,2,3];

foo( a );

a; // [1,2,3,4]  not  [4,5,6,7]

আমরা যখন aতর্কটি পাস করি তখন এটি aরেফারেন্সের একটি অনুলিপি বরাদ্দ করে xxএবং aপৃথক রেফারেন্সগুলি একই [1,2,3]মানের দিকে নির্দেশ করে । এখন, ফাংশনের অভ্যন্তরে, আমরা সেই রেফারেন্সটি মানটি ( push(4)) পরিবর্তনের জন্য ব্যবহার করতে পারি । কিন্তু যখন আমরা অ্যাসাইনমেন্টটি করি x = [4,5,6], এটি প্রাথমিক রেফারেন্সটি aনির্দেশ করছে যেখানে কোনওভাবেই এটি প্রভাবিত করে না - এখনও (এখন পরিবর্তিত) [1,2,3,4]মানটি নির্দেশ করে।

কার্যকরভাবে একটি যৌগিক মান (যেমন একটি array) মান-অনুলিপি দ্বারা পাস করার জন্য আপনাকে ম্যানুয়ালি এটির একটি অনুলিপি তৈরি করতে হবে, যাতে পাস হওয়া রেফারেন্সটি এখনও মূলটির দিকে ইঙ্গিত না করে। উদাহরণ স্বরূপ:

foo( a.slice() );

যৌগিক মান (বস্তু, অ্যারে, ইত্যাদি) যা রেফারেন্স-অনুলিপি দ্বারা পাস করা যেতে পারে

function foo(wrapper) {
    wrapper.a = 42;
}

var obj = {
    a: 2
};

foo( obj );

obj.a; // 42

এখানে, objস্কেলারের আদিম সম্পত্তির জন্য মোড়কের কাজ করে a। যখন পাস করা হয় foo(..), objরেফারেন্সের একটি অনুলিপি প্রবেশ করে wrapperপ্যারামিটারে সেট করা হয় । আমরা এখন wrapperভাগ করা অবজেক্ট অ্যাক্সেস করতে এবং এর সম্পত্তি আপডেট করার জন্য রেফারেন্সটি ব্যবহার করতে পারি । ফাংশন শেষ হওয়ার পরে, obj.aআপডেট হওয়া মানটি দেখতে পাবেন42

সূত্র


আপনি প্রথমে "যৌগিক মানগুলি সর্বদা রেফারেন্স-অনুলিপি দ্বারা বরাদ্দ / পাস করা হয়" বলে উল্লেখ করেন এবং তারপরে আপনি " x এর সাথে একটি রেফারেন্সের একটি অনুলিপি নির্ধারণ করেন" state আপনি যাকে "যৌগিক মান" বলছেন তার ক্ষেত্রে, আসল পরিবর্তনশীল মান হ'ল রেফারেন্স (যেমন মেমরি পয়েন্টার)। ঠিক যেমনটি আপনি ব্যাখ্যা করেছেন, রেফারেন্সটি অনুলিপি করা হয়েছে ... সুতরাং ভেরিয়েবলের মানটি অনুলিপি করা হয়েছে , আবার জোর দিয়ে যে রেফারেন্সটি মান । তার মানে জাভাস্ক্রিপ্ট হ'ল সকল প্রকারের জন্য পাস-বাই-মান। পাস-বাই-মান মানে ভেরিয়েবলের মানটির একটি অনুলিপি পাস করা passing এটি কোনও ব্যাপার নয় যে মানটি কোনও অবজেক্ট / অ্যারের উল্লেখ।
সি পার্কিনস

আপনি নতুন পরিভাষা (মান-অনুলিপি / রেফারেন্স-অনুলিপি) প্রবর্তন করেন এবং এটি কেবল জিনিসগুলিকে আরও জটিল করে তুলেছে। এখানে কেবল কপি, পিরিয়ড রয়েছে। আপনি যদি কোনও আদিম পাস করেন আপনি প্রকৃত আদিম তথ্যগুলির একটি অনুলিপি পাস করেছেন, যদি আপনি কোনও বস্তুটি পাস করেন তবে আপনি বস্তুর স্মৃতি অবস্থানের একটি অনুলিপি পাস করেছেন। আপনাকে শুধু এটিই বলতে হবে। আরও কিছু মানুষকে আরও বিভ্রান্ত করে।
স্কট মার্কাস

9

ঠিক আছে, এটি 'পারফরম্যান্স' এবং 'গতি' এবং প্রোগ্রামিং ভাষায় 'মেমরি ম্যানেজমেন্ট' সরল শব্দে।

জাভাস্ক্রিপ্টে আমরা দুটি স্তরে মান রাখতে পারি: টাইপ 1 - objectsএবং টাইপ 2 - অন্যান্য মানের মতো সমস্ত ধরণের string&boolean ও ইত্যাদি

আপনি যদি মেমোরিটিকে নীচের স্কোয়ারের মতো কল্পনা করেন যা তাদের প্রতিটিতে কেবল একটি টাইপ 2-মান সংরক্ষণ করা যায়:

এখানে চিত্র বর্ণনা লিখুন

প্রতিটি টাইপ 2-মান (সবুজ) একক বর্গ যেখানে টাইপ 1-মান (নীল) তাদের একটি গ্রুপ :

এখানে চিত্র বর্ণনা লিখুন

মুল বক্তব্যটি হ'ল আপনি যদি টাইপ 2-মান নির্দেশ করতে চান তবে ঠিকানাটি সরল তবে আপনি টাইপ 1-মানের জন্য একই জিনিসটি করতে চান এটি মোটেই সহজ নয়! :

এখানে চিত্র বর্ণনা লিখুন

এবং আরও জটিল গল্পে:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং এখানে উল্লেখগুলি আমাদের উদ্ধার করতে পারে: এখানে চিত্র বর্ণনা লিখুন

যদিও এখানে সবুজ তীরটি একটি সাধারণ ভেরিয়েবল, বেগুনি রঙের একটি অবজেক্ট ভেরিয়েবল, সুতরাং কারণ সবুজ তীর (সাধারণ ভেরিয়েবল) কেবল একটি কাজ করে (এবং এটি একটি আদর্শ মানের নির্দেশ করে) আমাদের এর মানটি থেকে আলাদা করার দরকার নেই এটি তাই আমরা যেখানেই যায় এর মান সহ সবুজ তীর স্থানান্তরিত করি এবং সমস্ত অ্যাসাইনমেন্ট, ফাংশন এবং তেমন ...

তবে আমরা বেগুনি তীর দিয়ে একই জিনিসটি করতে পারি না, আমরা এখানে 'জন' সেল বা অন্য অনেকগুলি জিনিস সরিয়ে নিতে চাই ... তাই বেগুনি তীরটি তার জায়গায় আটকে থাকবে এবং কেবল নির্দিষ্ট তীরচিহ্নগুলি যা স্থানান্তরিত হবে তা স্থানান্তরিত হবে ...

খুব বিভ্রান্তিকর পরিস্থিতি এমনটি যেখানে আপনি বুঝতে পারবেন না যে কীভাবে আপনার রেফারেন্সড ভেরিয়েবল পরিবর্তন হয়, আসুন একটি খুব ভাল উদাহরণটি দেখুন:

let arr = [1, 2, 3, 4, 5]; //arr is an object now and a purple arrow is indicating it
let obj2 = arr; // now, obj2 is another purple arrow that is indicating the value of arr obj
let obj3 = ['a', 'b', 'c'];
obj2.push(6); // first pic below - making a new hand for the blue circle to point the 6
//obj2 = [1, 2, 3, 4, 5, 6]
//arr = [1, 2, 3, 4, 5, 6]
//we changed the blue circle object value (type1-value) and due to arr and obj2 are indicating that so both of them changed
obj2 = obj3; //next pic below - changing the direction of obj2 array from blue circle to orange circle so obj2 is no more [1,2,3,4,5,6] and it's no more about changing anything in it but we completely changed its direction and now obj2 is pointing to obj3
//obj2 = ['a', 'b', 'c'];
//obj3 = ['a', 'b', 'c'];

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


8

মান দ্বারা পাস এবং রেফারেন্স (জাভাস্ক্রিপ্ট) এর পাসের জন্য এটি আরও কিছুটা ব্যাখ্যা। এই ধারণায়, তারা রেফারেন্সের মাধ্যমে ভেরিয়েবলটি পাস করার এবং রেফারেন্স দ্বারা ভেরিয়েবলটি পাস করার বিষয়ে কথা বলছে।

মান দ্বারা পাস (প্রাথমিক টাইপ)

var a = 3;
var b = a;

console.log(a); // a = 3
console.log(b); // b = 3

a=4;
console.log(a); // a = 4
console.log(b); // b = 3
  • জাভাস্ক্রিপ্টের সমস্ত আদিম ধরণের ক্ষেত্রে (স্ট্রিং, সংখ্যা, বুলিয়ান, অপরিজ্ঞাত এবং নাল) প্রযোজ্য।
  • ক একটি মেমরি বরাদ্দ করা হয়েছে (বলুন 0x001) এবং খ মেমরিতে মানের একটি অনুলিপি তৈরি করে (বলুন 0x002)।
  • সুতরাং ভেরিয়েবলের মান পরিবর্তন করা অন্যটিকে প্রভাবিত করে না, কারণ তারা উভয়ই দুটি পৃথক স্থানে থাকে।

রেফারেন্স দ্বারা পাস করুন (বস্তু)

var c = { "name" : "john" };
var d = c;

console.log(c); // { "name" : "john" }
console.log(d); // { "name" : "john" }

c.name = "doe";

console.log(c); // { "name" : "doe" }
console.log(d); // { "name" : "doe" }
  • জাভাস্ক্রিপ্ট ইঞ্জিনটি ভেরিয়েবলকে বস্তুটি বরাদ্দ করে c এবং এটি কিছু স্মৃতিতে নির্দেশ করে, বলে (0x012)।
  • যখন d = c, এই পদক্ষেপে d একই অবস্থানের দিকে নির্দেশ করে (0x012)।
  • উভয় ভেরিয়েবলের জন্য কোনও পরিবর্তনের মান পরিবর্তন করা।
  • ফাংশন অবজেক্টস

বিশেষ ক্ষেত্রে, রেফারেন্স দ্বারা পাস (বস্তু)

c = {"name" : "jane"};
console.log(c); // { "name" : "jane" }
console.log(d); // { "name" : "doe" }
  • সমান (=) অপারেটর নতুন মেমরির স্থান বা ঠিকানা সেট আপ করে

আপনার তথাকথিত বিশেষ ক্ষেত্রে এটি অ্যাসাইনমেন্ট অপারেটর নয় যা মেমরির জায়গার বরাদ্দের কারণ হয়ে দাঁড়ায়, এটি নিজেই বস্তুটি আক্ষরিক । কার্লি ব্র্যাকেট স্বরলিপি একটি নতুন অবজেক্ট তৈরির কারণ ঘটায়। cনতুন বস্তুর উল্লেখের অনুলিপিটিতে সম্পত্তি সেট করা আছে।
জর্জিউগ

6

জাভাস্ক্রিপ্টে রেফারেন্স সম্পর্কে আমি যা জানি তা ভাগ করে নিচ্ছি

জাভাস্ক্রিপ্টে, যখন কোনও ভেরিয়েবলের জন্য কোনও বিষয় বরাদ্দ করা হয়, ভেরিয়েবলের জন্য নির্ধারিত মানটি বস্তুর একটি রেফারেন্স:

var a = {
  a: 1,
  b: 2,
  c: 3
};
var b = a;

// b.c is referencing to a.c value
console.log(b.c) // Output: 3
// Changing value of b.c
b.c = 4
// Also changes the value of a.c
console.log(a.c) // Output: 4


1
এটি একটি অত্যধিক সরল উত্তর যা পূর্বের উত্তরগুলি আরও ভালভাবে ব্যাখ্যা করে না এমন কিছুই বলে না। আপনি কেন বিশেষ কেস হিসাবে অ্যারে ডাকছেন তা সম্পর্কে আমি বিভ্রান্ত।
কুইন্টিন

1
" বস্তুগুলিকে রেফারেন্স হিসাবে সংরক্ষণ করা হয় " বিভ্রান্তিমূলক। আমি আপনাকে যা বোঝাতে চাইছি তা হ'ল যখন কোনও ভেরিয়েবলের জন্য কোনও বিষয় বরাদ্দ করা হয় তখন ভেরিয়েবলের জন্য নির্ধারিত মানটি বস্তুর একটি রেফারেন্স হয়।
রবজি

এটি কোনও ফাংশনের অভ্যন্তরে কোনও অবজেক্ট আপডেট করার সমস্যার সমাধান করে না যা ফাংশনের বাইরে অবজেক্টটিকে আপডেট করে না। এটি পুরো চিত্র যেখানে মনে হয় রেফারেন্সের পরিবর্তে মান হিসাবে কাজ করে। অতএব -1
মাস্টার 4

@ মাস্টার এটি নির্দেশ করার জন্য ধন্যবাদ! আপনি কি একটি সম্পাদনা পরামর্শ
xameeramir

হাহাহা, আমি চেষ্টা করেছি ... আমার প্রস্তাবিত সম্পাদনাটি খুব বেশি পরিবর্তিত হয়েছে
এএমডিকে

4

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

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

পরিবর্তনশীল : একটি প্রতীকের সম্মিলিত ধারণা যা স্মৃতিতে একটি নির্দিষ্ট অবস্থানে একটি মানকে উল্লেখ করে। এই শব্দটি সাধারণত বিশদ আলোচনা করার জন্য একা ব্যবহৃত হতে পারে না।

প্রতীক : পাঠ্য স্ট্রিংটি ভেরিয়েবল (যেমন ভেরিয়েবলের নাম) বোঝাতে ব্যবহৃত হয়।

মান : বিশেষ বিটগুলি মেমোরিতে সংরক্ষণ করা হয় এবং ভেরিয়েবলের প্রতীক ব্যবহার করে রেফারেন্স করা হয়।

স্মৃতি অবস্থান : যেখানে একটি ভেরিয়েবলের মান সংরক্ষণ করা হয়। (অবস্থানটি নিজেরাই অবস্থানের সঞ্চিত মান থেকে আলাদা একটি সংখ্যা দ্বারা প্রতিনিধিত্ব করা হয়))

ফাংশন প্যারামিটার : একটি ফাংশন সংজ্ঞা হিসাবে চলক ঘোষিত, ফাংশনটি পাসের রেফারেন্সিং জন্য ব্যবহৃত হয়।

ফাংশন আর্গুমেন্ট : কলকারীর দ্বারা ফাংশনে প্রেরণ করা ফাংশনের বাইরে পরিবর্তনশীল।

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

আদিম পরিবর্তনশীল : পরিবর্তনশীল যার মান হ'ল আসল মান। এমনকি এই ধারণাটি অটো-বক্সিং এবং বিভিন্ন ভাষার বস্তুর মতো প্রসঙ্গে জটিল হতে পারে তবে সাধারণ ধারণাগুলি হ'ল ভেরিয়েবলের মান হ'ল পরিবর্তনের প্রতীক দ্বারা অন্য মেমরির অবস্থানের পরিবর্তে পরিবর্তিত প্রতীক দ্বারা প্রতিনিধিত্ব করা প্রকৃত মান।

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

পাস-বাই-ভ্যালু বা কল-বাই শেয়ারিং (অবজেক্টের জন্য): ফাংশন আর্গুমেন্টের মানটি অন্য মেমরির স্থিতিতে জমা দেওয়া হয় যা ফাংশনটির প্যারামিটার প্রতীক দ্বারা চিহ্নিত করা হয় (এটি স্ট্যাক বা স্তূপে নির্বিশেষে)। অন্য কথায়, ফাংশন প্যারামিটারটি পাস হওয়া আর্গুমেন্টের মানটির একটি অনুলিপি পেয়েছে ... এবং (সমালোচনামূলক) আর্গুমেন্টের মান কলিং ফাংশনটির দ্বারা আপডেট / পরিবর্তিত / পরিবর্তিত হয় না। মনে রাখবেন, কোনও বস্তুর ভেরিয়েবলের মানটি বস্তু নিজেই নয়, বরং এটি বস্তুর পয়েন্টার হয়, সুতরাং মান দ্বারা কোনও বস্তু ভেরিয়েবলটি পাস করে পয়েন্টারটিকে ফাংশন প্যারামিটার ভেরিয়েবলের অনুলিপি করে। ফাংশন প্যারামিটারের মান স্মৃতিতে ঠিক একই বস্তুকে নির্দেশ করে points অবজেক্টের ডেটা নিজেই ফাংশন প্যারামিটারের মাধ্যমে পরিবর্তন করা যেতে পারে, তবে ফাংশন আর্গুমেন্টের মান আপডেট করা হয় না, তাই এটি বিন্দুতে অবিরত থাকবে একইফাংশন কল জুড়ে এবং তার পরেও অবজেক্ট (এমনকি যদি তার বস্তুর ডেটা পরিবর্তন করা হয়েছিল বা ফাংশন প্যারামিটারটি সম্পূর্ণ আলাদাভাবে আলাদাভাবে বরাদ্দ করা থাকে)। রেফারেন্সযুক্ত বস্তুটি ফাংশন প্যারামিটার ভেরিয়েবলের মাধ্যমে আপডেটযোগ্য হওয়ার কারণে ফাংশন আর্গুমেন্টটি রেফারেন্স দ্বারা পাস করা হয়েছিল এমন সিদ্ধান্তে পৌঁছানো ভুল।

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

জাভাস্ক্রিপ্ট রেফারেন্স দ্বারা পাস করে না। আপনি যদি ঘনিষ্ঠভাবে পড়েন, আপনি বুঝতে পারবেন যে সমস্ত বিপরীত মতামতগুলি পাস-বাই-ভ্যালু বলতে কী বোঝায় তা ভুল বুঝায় এবং তারা ভ্রান্তভাবে সিদ্ধান্ত নিয়েছে যে ফাংশন প্যারামিটারের মাধ্যমে কোনও অবজেক্টের ডেটা আপডেট করার ক্ষমতা "পাস-বাই-মান" এর সমার্থক।

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


4

জাভাস্ক্রিপ্ট রেফারেন্স দ্বারা মান এবং অবজেক্টের ধরণের মাধ্যমে আদিম প্রকারগুলি পাস করে

এখন, লোকেরা জাভা এবং কী কী তা বর্ণনা করার সঠিক উপায় "রেফারেন্স দ্বারা পাস" কিনা তা নিয়ে অবিরাম বেকিং করতে পছন্দ করে। আসলে কি। কথাটি হ'ল:

  1. কোনও বস্তু পাস করা অবজেক্টটি অনুলিপি করে না।
  2. কোনও ফাংশনে পাস করা কোনও অবজেক্টের সদস্যরা ফাংশনটির মাধ্যমে তার সংশোধন করতে পারে।
  3. কোনও ক্রিয়াকলাপে আদিম মানটি ফাংশনটির মাধ্যমে সংশোধন করা যায় না। একটি কপি তৈরি করা হয়।

আমার বইয়ে এটাকে রেফারেন্স দ্বারা পাস বলা হয়।

- ব্রায়ান দ্বি - কোন প্রোগ্রামিং ভাষাগুলি রেফারেন্স সহ পাস হয়?


হালনাগাদ

এখানে এটি একটি প্রত্যাখ্যান:

জাভাস্ক্রিপ্টে কোনও "পাস বাই রেফারেন্স" উপলব্ধ নেই।


@ অ্যামি কারণ এটি মান দ্বারা পাস বর্ণনা করছে, রেফারেন্স দ্বারা পাস নয়। এই উত্তরটি ভালো যে শো পার্থক্য হল: stackoverflow.com/a/3638034/3307720
nasch

@ নাশা আমি পার্থক্যটি বুঝতে পারি। # 1 এবং # 2 পাস-বাই-রেফ শব্দার্থবিজ্ঞানের বর্ণনা দিচ্ছে। # 3 পাস-বাই-ভ্যালু শব্দার্থবিজ্ঞানের বর্ণনা দিচ্ছে।
অ্যামি

@ আমার 1, 2 এবং 3 সমস্ত মান দ্বারা পাসের সাথে সামঞ্জস্যপূর্ণ। রেফারেন্স দিয়ে পাস করার জন্য আপনারও দরকার পড়বে 4: ফাংশনের অভ্যন্তরে একটি নতুন মানের রেফারেন্স নির্ধারণ করা (= অপারেটরের সাথে) এছাড়াও ফাংশনের বাইরে রেফারেন্সকে পুনরায় সাইন করে। এটি জাভাস্ক্রিপ্টের ক্ষেত্রে নয়, এটিকে একচেটিয়াভাবে মূল্য দিয়ে যায়। যখন কোনও বস্তুটি পাস করার সময় আপনি বস্তুটিতে একটি পয়েন্টারটি পাস করেন এবং আপনি সেই বিন্দুটিকে মান দ্বারা পাস করেন।
নাস্তা

এটি "পাস-বাই-রেফারেন্স" বলতে বোঝায় না। আপনি আমার প্রশ্নটি সন্তুষ্ট করেছেন, এবং আমি আপনার সাথে একমত নই। ধন্যবাদ।
অ্যামি

"আমার বইয়ে এটাকে রেফারেন্স দ্বারা পাস বলা হয়।" - প্রতিটি একক সংকলক গ্রন্থে, দোভাষী বই, প্রোগ্রামিং ভাষার তত্ত্বের বই এবং কম্পিউটার বিজ্ঞানের বই যে কোনও সময়ে লেখা হয়েছে, তা নয়।
জার্গ ডব্লু মিত্তাগ

3

এটি বুঝতে আমার সহজ উপায় ...

  • কোনও ফাংশন কল করার সময় আপনি আর্গুমেন্ট ভেরিয়েবলের বিষয়বস্তু (রেফারেন্স বা মান) পাস করছেন, ভেরিয়েবলগুলি নিজেরাই নয়।

    var var1 = 13;
    var var2 = { prop: 2 };
    
    //13 and var2's content (reference) are being passed here
    foo(var1, var2); 
  • ফাংশনের অভ্যন্তরে, প্যারামিটার ভেরিয়েবলগুলি inVar1এবং inVar2সামগ্রীগুলি উত্তীর্ণ হওয়া গ্রহণ করে।

    function foo(inVar1, inVar2){
        //changing contents of inVar1 and inVar2 won't affect variables outside
        inVar1 = 20;
        inVar2 = { prop: 7 };
    }
  • যেহেতু inVar2রেফারেন্স পেয়েছে { prop: 2 }, আপনি বস্তুর সম্পত্তির মান পরিবর্তন করতে পারেন।

    function foo(inVar1, inVar2){
        inVar2.prop = 7; 
    }

3

জাভাস্ক্রিপ্টের কোনও ক্রিয়াকলাপে আর্গুমেন্টগুলি পাঠানো সি তে পয়েন্টার মান দ্বারা পরামিতিগুলি পাস করার সাথে সমতুল্য:

/*
The following C program demonstrates how arguments
to JavaScript functions are passed in a way analogous
to pass-by-pointer-value in C. The original JavaScript
test case by @Shog9 follows with the translation of
the code into C. This should make things clear to
those transitioning from C to JavaScript.

function changeStuff(num, obj1, obj2)
{
    num = num * 10;
    obj1.item = "changed";
    obj2 = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);    
console.log(obj2.item);

This produces the output:

10
changed
unchanged
*/

#include <stdio.h>
#include <stdlib.h>

struct obj {
    char *item;
};

void changeStuff(int *num, struct obj *obj1, struct obj *obj2)
{
    // make pointer point to a new memory location
    // holding the new integer value
    int *old_num = num;
    num = malloc(sizeof(int));
    *num = *old_num * 10;
    // make property of structure pointed to by pointer
    // point to the new value
    obj1->item = "changed";
    // make pointer point to a new memory location
    // holding the new structure value
    obj2 = malloc(sizeof(struct obj));
    obj2->item = "changed";
    free(num); // end of scope
    free(obj2); // end of scope
}

int num = 10;
struct obj obj1 = { "unchanged" };
struct obj obj2 = { "unchanged" };

int main()
{
    // pass pointers by value: the pointers
    // will be copied into the argument list
    // of the called function and the copied
    // pointers will point to the same values
    // as the original pointers
    changeStuff(&num, &obj1, &obj2);
    printf("%d\n", num);
    puts(obj1.item);
    puts(obj2.item);
    return 0;
}

1
আমি জাভাস্ক্রিপ্টের ক্ষেত্রে এটি মনে করি না: `` `জাভাস্ক্রিপ্টের বর্ণ সংখ্যা = 5;
ডানাইল নাচেভ

@ ডানাইলনাচেভ: যদিও এটি প্রযুক্তিগতভাবে সত্য হতে পারে তবে পার্থক্যটি কেবলমাত্র পরিবর্তনযোগ্য বস্তুর জন্য পর্যবেক্ষণযোগ্য যা ECMAScript আদিমগুলি নয়।
জার্গ ডব্লু মিত্তাগ

3

প্রোগ্রামিং ভাষার আইনজীবীদের জন্য, আমি ECMAScript 5.1 (যা সর্বশেষ সংস্করণের চেয়ে পড়া সহজ) এর নিম্নলিখিত বিভাগগুলি দিয়ে গিয়েছি এবং এটি ECMAScript মেলিং তালিকায় যতদূর জিজ্ঞাসা করেছি।

টিএল; ডিআর : প্রতিটি মূল্যবোধটি মান দ্বারা উত্তীর্ণ হয়েছে তবে অবজেক্টের বৈশিষ্ট্যগুলি উল্লেখযোগ্য এবং অবজেক্টের সংজ্ঞাটি ক্রাইপল স্ট্যান্ডার্ডের অভাবে।

যুক্তি তালিকার নির্মাণ

বিভাগ 11.2.4 "আর্গুমেন্ট তালিকাগুলি" কেবলমাত্র 1 টি যুক্তি সমন্বিত একটি যুক্তি তালিকা তৈরি করার বিষয়ে নিম্নলিখিতটি বলে:

উত্পাদনের আর্গুমেন্টলিস্ট: অ্যাসাইনমেন্টএক্সপ্রেশন নিম্নরূপে মূল্যায়ন করা হয়:

  1. আসুন AssignmentExpression মূল্যায়নের ফলাফল হতে দিন।
  2. আর্টটি গেটভ্যালু (রেফ) করা যাক।
  3. যার তালিকাতে একমাত্র আইটেমটি আর্গুমেন্ট রয়েছে Return

বিভাগটি এমন মামলাগুলিও গণ্য করে যেখানে আর্গুমেন্ট তালিকার 0 বা> 1 টি আর্গুমেন্ট রয়েছে।

সুতরাং, সবকিছু রেফারেন্স দ্বারা পাস করা হয়।

অবজেক্ট প্রোপার্টি অ্যাক্সেস

বিভাগ 11.2.1 "সম্পত্তি অ্যাকসেসর"

উত্পাদনের সদস্যপদ: এক্সপ্রেসন [এক্সপ্রেশন] নিম্নলিখিত হিসাবে মূল্যায়ন করা হয়:

  1. বেসএরফারেন্সকে মেম্বার এক্সপ্রেসনের মূল্যায়নের ফলাফল হতে দিন।
  2. বেসভ্যালুটি getValue (বেসরাইফারেন্স) হতে দিন।
  3. সম্পত্তির নাম রেফারেন্সটিকে এক্সপ্রেশন মূল্যায়নের ফলাফল হিসাবে দেখা যাক।
  4. প্রোপার্টি নেমভ্যালুটি getValue (সম্পত্তি নাম রেফারেন্স) হতে দিন Let
  5. চেকঅবজেক্টকোসরসিবল (বেসভ্যালু) কল করুন।
  6. প্রোপার্টিনেমস্ট্রিং টুস্ট্রিং (প্রপার্টি নেমভ্যালু) হতে দিন।
  7. যদি সিনট্যাকটিক উত্পাদনের মূল্যায়ন করা হয় তবে যদি তা কঠোর মোড কোডের মধ্যে থাকে তবে কঠোরভাবে সত্য হওয়া উচিত, অন্যথায় কঠোরভাবে মিথ্যা হোক।
  8. টাইপ রেফারেন্সের একটি মান ফেরান যার মূল মানটি বেসভ্যালু এবং যার রেফারেন্সকৃত নাম প্রপার্টি নেমস্ট্রিং, এবং যার কঠোর মোড পতাকাটি কঠোর।

সুতরাং, অবজেক্টের বৈশিষ্ট্য সর্বদা রেফারেন্স হিসাবে উপলব্ধ।

অন ​​রেফারেন্স

এটি ৮.7 বিভাগে "রেফারেন্স স্পেসিফিকেশন টাইপ" তে বর্ণিত হয়েছে, যে উল্লেখগুলি ভাষার কোনও প্রকৃত প্রকার নয় - এগুলি কেবল মুছুন, টাইপফ এবং অ্যাসাইনমেন্ট অপারেটরদের আচরণের বর্ণনা দিতে ব্যবহৃত হয়।

"অবজেক্ট" সংজ্ঞা

এটি 5.1 সংস্করণে সংজ্ঞায়িত করা হয়েছে যে "একটি বিষয় সম্পত্তিগুলির সংগ্রহ"। অতএব, আমরা অনুমান করতে পারি যে বস্তুর মান সংগ্রহটি, তবে সংগ্রহের মূল্য কী তা অনুমান অনুসারে সংজ্ঞায়িত করা হয়েছে এবং এটি বোঝার জন্য কিছুটা প্রচেষ্টা প্রয়োজন ।


মান দ্বারা পাস হওয়া যুক্তি, রেফারেন্স দ্বারা প্রেরিত যুক্তি, সম্পূর্ণ বস্তুর ক্রিয়াকলাপ এবং তাদের সম্পত্তিগুলির ক্রিয়াকলাপগুলির মধ্যে কতগুলি লোক বিভ্রান্ত হয় তা কখনই আমাকে বিস্মিত করে না। 1979 সালে, আমি কম্পিউটার এমনিতে আমার ডিগ্রি পেলাম না, তার পরিবর্তে আমার এমবিএ প্রোগ্রামে 15 ঘন্টা বা তার বেশি সিএস ইলেকটিভ যুক্ত করার জন্য নির্বাচন করলাম। তা সত্ত্বেও, তাড়াতাড়ি আমার কাছে স্পষ্ট হয়ে উঠল যে এই ধারণাগুলি সম্পর্কে আমার উপলব্ধি কম্পিউটার বিজ্ঞান বা গণিতে ডিগ্রিধারী আমার কোনও সহকর্মীর দ্বারা কমপক্ষে ছিল good অ্যাসেমব্লার অধ্যয়ন করুন, এবং এটি বেশ পরিষ্কার হয়ে যাবে।
ডেভিড এ গ্রে 6

3

এমডিএন ডক্স খুব ভার্জোজ না করে এটিকে পরিষ্কারভাবে ব্যাখ্যা করে:

একটি ফাংশন কলের পরামিতিগুলি হ'ল ফাংশনের যুক্তি । আর্গুমেন্টগুলি মান অনুসারে ফাংশনে প্রেরণ করা হয় । যদি ফাংশনটি একটি আর্গুমেন্টের মান পরিবর্তন করে তবে এই পরিবর্তনটি বিশ্বব্যাপী বা কলিং ফাংশনে প্রতিফলিত হয় না। তবে, অবজেক্টের রেফারেন্সগুলিও মানগুলি, এবং সেগুলি বিশেষ: ফাংশনটি যদি রেফারেন্স করা অবজেক্টের বৈশিষ্ট্যগুলিকে পরিবর্তন করে তবে সেই পরিবর্তনটি ফাংশনের বাইরে দৃশ্যমান হয়, (...)

সূত্র: https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Funtions#Description


1

নিম্ন স্তরের ভাষায়, আপনি যদি রেফারেন্সের মাধ্যমে কোনও ভেরিয়েবল পাস করতে চান তবে আপনাকে ফাংশন তৈরির ক্ষেত্রে একটি নির্দিষ্ট বাক্য গঠন ব্যবহার করতে হবে:

int myAge = 14;
increaseAgeByRef(myAge);
function increaseAgeByRef(int &age) {
  *age = *age + 1;
}

&ageএকটি রেফারেন্স myAge, কিন্তু আপনি যদি মান চাই, রেফারেন্স রূপান্তর করতে ব্যবহার আছে *age

জাভাস্ক্রিপ্ট একটি উচ্চ স্তরের ভাষা যা আপনার জন্য এই রূপান্তরটি করে। সুতরাং, যদিও বস্তুগুলি রেফারেন্স দ্বারা পাস করা হয়েছে, ভাষা রেফারেন্স প্যারামিটারটিকে মানকে রূপান্তর করে। &ফাংশন সংজ্ঞা অনুসারে, আপনাকে এটি ব্যবহারের দরকার নেই *, রেফারেন্সের মাধ্যমে এটি পাস করার জন্য, না কোনও , ফাংশন বডিতে, রেফারেন্সটিকে মানকে রূপান্তর করতে, জেএস এটি আপনার জন্য করে।

এ কারণেই আপনি যখন কোনও ফাংশনের অভ্যন্তরে কোনও বস্তুর পরিবর্তনের চেষ্টা করেন, এর মান (অর্থাত্ age = {value:5}) প্রতিস্থাপন করে , পরিবর্তনটি স্থির হয় না, তবে আপনি যদি এর বৈশিষ্ট্যগুলি (যেমন age.value = 5) পরিবর্তন করেন তবে তা হয়।

আরও জানুন


1

আমি এই উত্তরগুলি একাধিকবার পড়েছি, তবে বারবারা লিসকভের বর্ণিত "ভাগ করে কল করুন" এর প্রযুক্তিগত সংজ্ঞা সম্পর্কে আমি যতক্ষণ না জেনেছি ততক্ষণ পর্যন্ত তা পেলাম না

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

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


না, কোনও বস্তু পরিবর্তনযোগ্য কিনা তা আসলে সমস্যা নয়। সবকিছু সর্বদা মান দ্বারা পাস করা হয়। এটি কেবল আপনি কী যাচ্ছেন তার উপর নির্ভর করে (কোনও মান বা একটি রেফারেন্স)। এই দেখুন ।
স্কট মার্কাস

তিনি যা বর্ণনা করছেন তা বাই-ভ্যালু দ্বারা একটি রেফারেন্স পাস করছে। নতুন পরিভাষা চালু করার কোনও কারণ নেই।
সঞ্জীব

1

বেশিরভাগ সহজ উপায়

// Copy JS object without reference
var first = {"a":"value1","b":"value2"};
var clone = JSON.parse( JSON.stringify( first ) ); 

var second = ["a","b","c"];
var clone = JSON.parse( JSON.stringify( second ) ); 

JSON.parse( JSON.stringify( obj ) )গভীর-ক্লোন অবজেক্টগুলির একটি ভয়ঙ্কর উপায়। এটি কেবল ধীরে ধীরে নয়, এটি ডেটা ক্ষতিও করতে পারে।
ডি পারদল

0

আমি খুঁজে পেয়েছি পদ্ধতি প্রসারিত এর Underscore.js গ্রন্থাগার খুব দরকারী যখন আমি একটি প্যারামিটার যা পারেন পরিবর্তন করা বা প্রতিস্থাপিত হতে পারে সম্পূর্ণরূপে যেমন একটি বস্তু মধ্যে পাস করতে চান।

function replaceOrModify(aObj) {
  if (modify) {

    aObj.setNewValue('foo');

  } else {

   var newObj = new MyObject();
   // _.extend(destination, *sources) 
   _.extend(newObj, aObj);
  }
}

0

আমি সর্বাধিক সংক্ষিপ্ত বিবরণটি এয়ারবিএনবি স্টাইল গাইডে পেয়েছি :

  • পুরস্কার : আপনি যখন কোনও আদিম ধরণের অ্যাক্সেস করেন তখন আপনি সরাসরি তার মূল্যের উপরে কাজ করেন

    • দড়ি
    • সংখ্যা
    • বুলিয়ান
    • খালি
    • অনির্দিষ্ট

উদাহরণ:

var foo = 1,
    bar = foo;

bar = 9;

console.log(foo, bar); // => 1, 9
  • কমপ্লেক্স : আপনি যখন কোনও জটিল ধরণের অ্যাক্সেস করেন তখন আপনি এর মান সম্পর্কিত একটি রেফারেন্সে কাজ করেন

    • উদ্দেশ্য
    • বিন্যাস
    • ক্রিয়া

উদাহরণ:

var foo = [1, 2],
    bar = foo;

bar[0] = 9;

console.log(foo[0], bar[0]); // => 9, 9

অর্থাত্ কার্যকরভাবে আদিম প্রকারগুলি মান দ্বারা পাস হয়, এবং জটিল প্রকারগুলি রেফারেন্স দ্বারা প্রেরণ করা হয়।


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

-1

আমি বলব এটি পাস-কপি -

আর্গুমেন্টগুলি বিবেচনা করুন এবং ভেরিয়েবল অবজেক্টগুলি হ'ল ফাংশন আমন্ত্রণের শুরুতে কার্যকর সম্পাদনা প্রসঙ্গে তৈরি হওয়া বস্তুগুলি - এবং আপনার আসল মান / রেফারেন্সটি ফাংশনে উত্তীর্ণ হয় কেবল এই আর্গুমেন্ট + ভেরিয়েবল অবজেক্টগুলিতে সঞ্চয় করা।

সহজ ভাষায়, আদিম ধরণের জন্য, ফাংশন কলের শুরুতে মানগুলি অনুলিপি করা হয়, অবজেক্ট টাইপের জন্য, রেফারেন্সটি অনুলিপি করা হয়।


1
"পাস-বাই-কপি" === মান অনুসারে পাস করুন
স্কট মার্কাস

-1

জাভাস্ক্রিপ্টে "রেফারেন্স দ্বারা পাস" শব্দটি ব্যবহার সম্পর্কে এখানে কিছু আলোচনা হয়েছে , তবে আপনার প্রশ্নের উত্তর দিতে:

কোনও বিষয় নির্দিষ্টভাবে উল্লেখ করার প্রয়োজন ছাড়াই স্বয়ংক্রিয়ভাবে রেফারেন্স দ্বারা পাস হয়ে যায়

(উপরে বর্ণিত নিবন্ধ থেকে।)


7
সংযুক্ত নিবন্ধটিতে আর কোনও বিবরণ নেই এবং সম্পূর্ণভাবে "রেফারেন্স দ্বারা পাস" ব্যবহার করা এড়ানো যায়।
সি পার্কিনস

মানটি একটি রেফারেন্স

-2

কিছু "রেফারেন্স দ্বারা পাস" কিনা তা নির্ধারণ করার একটি সহজ উপায় আপনি "অদলবদল" ফাংশন লিখতে পারেন কিনা তা। উদাহরণস্বরূপ, সি-তে আপনি এটি করতে পারেন:

void swap(int *i, int *j)
{
    int t;
    t = *i;
    *i = *j;
    *j = t;
}

আপনি যদি জাভাস্ক্রিপ্টের সমতুল্য না করতে পারেন তবে এটি "রেফারেন্স দ্বারা পাস" নয়।


21
এটি সত্যই রেফারেন্স দ্বারা পাস হয় না। আপনি ফাংশনটিতে পয়েন্টারগুলি অতিক্রম করছেন, এবং সেই পয়েন্টারগুলি মান দ্বারা পাস হচ্ছে। এর চেয়ে ভাল উদাহরণ হ'ল সি ++ এর & অপারেটর বা সি # এর "রেফ" কীওয়ার্ড, উভয়ই সত্যই রেফারেন্স দ্বারা পাস হয়।
ম্যাট গ্রেয়ার

এমনকি সহজ এটি যা জাভাস্ক্রিপ্টে মান দ্বারা পাস করা হয়।
স্কট মার্কাস


-3
  1. স্ট্রিংয়ের মতো আদিম ধরণের পরিবর্তনশীল, সংখ্যা সর্বদা মান দ্বারা পাস হিসাবে পাস হয়।
  2. অ্যারে এবং অবজেক্ট এই দুটি শর্তের উপর ভিত্তি করে রেফারেন্স হিসাবে পাস বা মান দ্বারা পাস হিসাবে পাস করা হয়।

    • আপনি যদি নতুন অবজেক্ট বা অ্যারের সাথে সেই অবজেক্টের বা অ্যারের মান পরিবর্তন করে থাকেন তবে এটি মান দ্বারা পাস হয়।

      object1 = {item: "car"}; array1=[1,2,3];

    এখানে আপনি পুরানো এককে নতুন অবজেক্ট বা অ্যারে বরাদ্দ করছেন old আপনি পুরানো বস্তুর সম্পত্তির মান পরিবর্তন করছেন না so সুতরাং এটি মান দ্বারা পাস হয়।

    • আপনি যদি কোনও বস্তুর বা অ্যারের সম্পত্তি মান পরিবর্তন করে থাকেন তবে এটি রেফারেন্স দ্বারা পাস হয়।

      object1.key1= "car"; array1[0]=9;

    এখানে আপনি পুরানো অবজেক্টের একটি সম্পত্তি মান পরিবর্তন করছেন old আপনি পুরানোটিকে নতুন অবজেক্ট বা অ্যারে বরাদ্দ করছেন না so সুতরাং এটি রেফারেন্স দ্বারা পাস।

কোড

    function passVar(object1, object2, number1) {

        object1.key1= "laptop";
        object2 = {
            key2: "computer"
        };
        number1 = number1 + 1;
    }

    var object1 = {
        key1: "car"
    };
    var object2 = {
        key2: "bike"
    };
    var number1 = 10;

    passVar(object1, object2, number1);
    console.log(object1.key1);
    console.log(object2.key2);
    console.log(number1);

Output: -
    laptop
    bike
    10

1
অ্যাসাইনমেন্ট অপারেটর একটি ফাংশন কল দিয়ে বিভ্রান্ত হবে না। আপনি যখন কোনও বিদ্যমান ভেরিয়েবলকে নতুন ডেটা নিয়োগ করেন তখন পুরানো ডেটার রেফারেন্স গণনা হ্রাস পায় এবং নতুন ডেটা পুরানো ভেরিয়েবলের সাথে যুক্ত থাকে। মূলত, ভেরিয়েবলটি নতুন ডেটার দিকে নির্দেশ করে শেষ হয়। সম্পত্তি ভেরিয়েবলগুলির ক্ষেত্রেও এটি একই। যেহেতু এই অ্যাসাইনমেন্টগুলি ফাংশন কল নয় তাই পাস-বাই-মান বা পাস-বাই-রেফারেন্সের সাথে তাদের কোনও সম্পর্ক নেই।
জন সন্ডারসন

1
না, সবসময় মান দ্বারা পাস করা হয়। এটি কেবল আপনি কী যাচ্ছেন তার উপর নির্ভর করে (কোনও মান বা একটি রেফারেন্স)। এই দেখুন ।
স্কট মার্কাস

-3
  1. প্রিমিটিভ (সংখ্যা, বুলিয়ান ইত্যাদি) মান দ্বারা পাস হয়।
    • স্ট্রিংগুলি অপরিবর্তনীয়, তাই এটি তাদের পক্ষে সত্যিকার অর্থে গুরুত্বপূর্ণ নয়।
  2. অবজেক্টগুলি রেফারেন্স দিয়ে পাস হয় (রেফারেন্সটি মান দিয়ে পাস হয়)।

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

আপনার দ্বিতীয় বিবৃতি নিজেই বিরোধিতা করছে is
জার্গ ডব্লু মিত্তাগ

-5

ফাংশনের অভ্যন্তরের সাধারণ মানগুলি ফাংশনের বাইরে সেই মানগুলিকে পরিবর্তন করে না (সেগুলি মান দ্বারা প্রেরণ করা হয়), তবে জটিলগুলি (সেগুলি রেফারেন্স দ্বারা পাস করা হয়) will

function willNotChange(x) {

    x = 1;
}

var x = 1000;

willNotChange(x);

document.write('After function call, x = ' + x + '<br>'); // Still 1000

function willChange(y) {

    y.num = 2;
}

var y = {num: 2000};

willChange(y);
document.write('After function call y.num = ' + y.num + '<br>'); // Now 2, not 2000

এটি হাস্যকর বিষয়, ক্রিয়ামূলক স্তরের স্কোপিংয়ের কারণে y বদলে যাবে, এটি উত্তোলন করে না কারণ এটি রেফারেন্স দিয়ে পাস হয়েছে।
পারিজাত কালিয়া

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