কীভাবে জাভাস্ক্রিপ্টে ভেরিয়েবল অ্যাসাইনমেন্ট কাজ করে?


99

তাই আমি জাভা স্ক্রিপ্টে ভর অ্যাসাইনমেন্টটি ঠিক কীভাবে কাজ করে তা দেখার জন্য আমি অন্যান্য দিন ঘুরেছিলাম।

প্রথম আমি কনসোলে এই উদাহরণটি চেষ্টা করেছি:

a = b = {};
a.foo = 'bar';
console.log(b.foo);

ফলাফলটি ছিল "বার" একটি সতর্কতার মধ্যে প্রদর্শিত হচ্ছে। এটি যথেষ্ট ন্যায্য, aএবং bসত্যই একই বস্তুর কেবলমাত্র উপস্বাদ। তখন আমি ভেবেছিলাম, কীভাবে আমি এই উদাহরণটিকে আরও সহজ করে তুলব।

a = b = 'foo';
a = 'bar';
console.log(b);

বেশ একই জিনিস, তাই না? ভাল এই সময়, এটি প্রথম উদাহরণের আচরণ থেকে যেমন প্রত্যাশা করব তা ফিরে আসে fooনা bar

কেন এমন হয়?

এনবি এই উদাহরণটি আরও নীচের কোড সহ আরও সহজ করা যেতে পারে:

a = {};
b = a;
a.foo = 'bar';
console.log(b.foo);

a = 'foo';
b = a;
a = 'bar';
console.log(b);

(আমি সন্দেহ করি যে জাভাস্ক্রিপ্ট স্ট্রিংগুলির মতো আদিমদের সাথে আচরণ করে এবং হ্যাশগুলির সাথে পৃথক সংখ্যার সাথে পৃথকভাবে আচরণ করে Has


এখানে নিয়োগ ব্যাখ্যা করে: syntaxsuccess.com/viewarticle/...
TGH

উত্তর:


115

প্রথম উদাহরণে, আপনি একটি বিদ্যমান অবজেক্টের একটি সম্পত্তি সেট করছেন। দ্বিতীয় উদাহরণে, আপনি একটি একেবারে নতুন অবজেক্ট নিযুক্ত করছেন।

a = b = {};

aএবং bএখন একই জিনিস পয়েন্টার। সুতরাং আপনি যখন করবেন:

a.foo = 'bar';

এটা তোলে সেট করে b.fooযেহেতু পাশাপাশি aএবং bবিন্দু একই বস্তু।

যাহোক!

পরিবর্তে আপনি যদি এটি করেন:

a = 'bar';

আপনি বলছেন যে aএখন একটি ভিন্ন বস্তু পয়েন্ট। এর aআগে কোনটি ইঙ্গিত করেছিল তার কোনও প্রভাব নেই ।

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

তবে একটি সম্পত্তি বরাদ্দকরণের মতো a.foo, বস্তুটি নির্দেশ করবে apoints এটি অবশ্যই অন্যান্য সমস্ত রেফারেন্সগুলিকে সংশোধন করে যা এই বস্তুটির দিকে নির্দেশ করে কেবল কারণ তারা প্রত্যেকে একই বস্তুর দিকে নির্দেশ করে।


4
"আপনি বলছেন যে এখন অন্য কোনও অবজেক্টের দিকে নির্দেশ করুন।" না, শব্দ শব্দটি ব্যবহার করবেন না। একটি স্ট্রিং জাভাস্ক্রিপ্টে কোনও অবজেক্ট নয়।
নসরেডনা

10
স্ট্রিংগুলি জাভাস্ক্রিপ্ট টাইপ "অবজেক্ট" প্রকারের প্রযুক্তিগতভাবে নয় তবে এগুলি ওও অর্থে অবজেক্টগুলির বিষয়ে চিন্তা করা যেতে পারে।
অ্যালেক্স ওয়েন

4
@ স্কেগি: স্ট্রিংগুলি আদিম বস্তু নয়, আপনি স্ট্রিংগুলিতে স্বেচ্ছাচারিত বৈশিষ্ট্য বরাদ্দ করতে পারবেন না! তারা কেবল জাভাতে অটোবক্সিং বলে যার কারণে বস্তুর মতো আচরণ করে
ক্রিস্টোফ

11
তবে স্ট্রিংগুলির পদ্ধতি এবং বৈশিষ্ট্য রয়েছে এবং স্ট্রিংয়ের প্রোটোটাইপ অবশ্যই সংশোধিত হতে পারে। তারা নিশ্চিতভাবে বস্তুর মতো কাজ করে act
ক্যামেরন মার্টিন

9
@ ডিডলশ্যাক: ক্রিস্টোফ যেমন ব্যাখ্যা করেছেন, এটি অটোবক্সিংয়ের কারণে। আপনি যদি একটি স্ট্রিং এর মাধ্যমে সংজ্ঞায়িত করেন var foo = new String('foo');তবে তা স্ট্রিং অবজেক্ট (এবং typeofএটি নিশ্চিত করবে)। তবে আপনি যদি এটি স্ট্রিং আক্ষরিক মাধ্যমে ঘোষণা করেন তবে তারা স্ট্রিং আদিম। দেখুন: বিকাশকারী.মোজিলা.অর্গ / জেনা জাভাস্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস_
জাভাস্ক্রিপ্ট

26

আপনার প্রশ্নের ইতিমধ্যে স্কেগি সন্তুষ্টভাবে উত্তর দিয়েছেন - বস্তু বনাম আদিমগুলির সাথে এর কোনও যোগসূত্র নেই, তবে একই রেফারেন্সযুক্ত বস্তুতে ভেরিয়েবল বনাম বনাম বৈশিষ্ট্যগুলি পুনর্নির্দিষ্টকরণের সাথে।

উত্তর এবং মন্তব্যে জাভাস্ক্রিপ্টের ধরণগুলি সম্পর্কে অনেক বিভ্রান্তি রয়েছে বলে মনে হচ্ছে, তাই এখানে জাভাস্ক্রিপ্টের টাইপ সিস্টেমের একটি ছোট্ট ভূমিকা:

জাভাস্ক্রিপ্টে মূলত দুটি ধরণের মান রয়েছে: আদিম এবং বস্তু (এবং 'হ্যাশ' এর মতো কোনও জিনিস নেই)।

স্ট্রিংস, সংখ্যা এবং বুলিয়ান পাশাপাশি nullএবং undefinedআদিম হয়, বস্তু হ'ল বৈশিষ্ট্য হ'ল সবকিছু। এমনকি অ্যারে এবং ফাংশনগুলি নিয়মিত অবজেক্ট এবং তাই স্বেচ্ছাসেবী সম্পত্তি রাখতে পারে। তারা কেবল অভ্যন্তরীণ [[শ্রেণি]] সম্পত্তিতে পৃথক (ক্রিয়াকলাপে [[কল]] এবং [[নির্মাণ]] নামে একটি সম্পত্তি রয়েছে তবে ওহে, এটি বিশদ)।

আদিম মানগুলি বস্তুর মতো আচরণ করতে পারে তার কারণ অটোবক্সিং, তবে আদিমরা নিজেরাই কোনও সম্পত্তি রাখতে পারে না।

এখানে একটি উদাহরণ:

var a = 'quux';
a.foo = 'bar';
document.writeln(a.foo);

এই আউটপুট হবে undefined : aএকটি আদিম মান ধারণ করে, যা সম্পত্তি বরাদ্দ করার সময় কোনও বস্তুতে প্রচার হয় foo। তবে এই নতুন অবজেক্টটি তত্ক্ষণাত বাতিল করা হয়েছে, সুতরাং এর মানটি হারাবে foo

এইভাবে ভেবে দেখুন:

var a = 'quux';
new String(a).foo = 'bar'; // we never save this new object anywhere!
document.writeln(new String(a).foo); // a completly new object gets created

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

2

আপনি "হ্যাশ" হিসাবে যা উল্লেখ করছেন তা বাদ দিয়ে আপনি কমবেশি সঠিক হন কেবল কোনও অবজেক্টের জন্য কেবল শর্টহ্যান্ড সিনট্যাক্স।

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


তাহলে কেন অবজেক্টের জন্য দ্বৈত মান?
ক্রিস লয়েড 0

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

4
না, পার্থক্যটি হ'ল দ্বিতীয় ক্ষেত্রে, আপনি কোনও স্ট্রিং নিয়ে কাজ করছেন, কোনও বস্তু নয়।
নসরেডনা

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

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

2

উত্তরের আমার সংস্করণটি এখানে:

obj = {a:"hello",b:"goodbye"}
x = obj
x.a = "bonjour"

// now obj.a is equal to "bonjour"
// because x has the same reference in memory as obj
// but if I write:
x = {}
x.a = obj.a
x.b = obj.b
x.a = "bonjour"

// now x = {a:"bonjour", b:"goodbye"} and obj = {a:"hello", b:"goodbye"}
// because x points to another place in the memory

0

আপনি একটি নতুন স্ট্রিং অবজেক্টের দিকে ইঙ্গিত করার জন্য সেট করছেন, যখন বি পুরানো স্ট্রিং অবজেক্টের দিকে ইশারা করে চলেছে।


0

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


0

পার্থক্যটি হ'ল সহজ ধরণের এবং অবজেক্টের মধ্যে।

কোনও বস্তু (অ্যারে বা কোনও ফাংশনের মতো) যে কোনও কিছু রেফারেন্স দ্বারা পাস করা হয়।

সাধারণ ধরণের (স্ট্রিং বা একটি সংখ্যার মতো) কিছু অনুলিপি করা হয়।

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


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

এই ছেলেরা ইতিমধ্যে এটি ব্যাখ্যা করার জন্য একটি ভাল কাজ করেছে, সুতরাং আমি কেবল লিঙ্কটি পেস্ট করব: স্ট্যাকওভারফ্লো / প্রশ্ন / 40480 / is-java-pass-by-references (আমি জাভা বোঝায়, তবে পাসিং এবং নির্ধারণের জন্য শব্দার্থক মান / রেফারেন্সগুলি জাভাস্ক্রিপ্টের মতোই)
জুয়ান পাবলো ক্যালিফোানো

4
আসলে এই উত্তরটি ভুল, সমস্ত কিছুই জাভাস্ক্রিপ্টে মান দ্বারা পাস করা হয়। এমডিএন থেকে, "একটি ফাংশন কলের পরামিতিগুলি হ'ল ফাংশনটির আর্গুমেন্ট Ar যুক্তিগুলি মান অনুসারে ফাংশনে প্রেরণ করা হয় the মানগুলিও, এবং সেগুলিও বিশেষ: ফাংশন যদি রেফারেন্স করা অবজেক্টের বৈশিষ্ট্যগুলিকে পরিবর্তন করে তবে সেই পরিবর্তনটি ফাংশনের বাইরে দৃশ্যমান। " বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

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