আমি কেন কোনও অ্যারে হিসাবে নামযুক্ত বৈশিষ্ট্য যুক্ত করতে পারি?


105

নিম্নলিখিত দুটি ভিন্ন কোড স্নিপেটগুলি আমার সমতুল্য বলে মনে হচ্ছে:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

এবং

var myObject = {'A': 'Athens', 'B':'Berlin'};

কারণ তারা উভয়ই একই রকম আচরণ করে এবং typeof(myArray) == typeof(myObjects)(উভয়ই 'বস্তু' দেয়) yield

এই রূপগুলির মধ্যে কোনও পার্থক্য আছে কি?

উত্তর:


131

কার্যত জাভাস্ক্রিপ্টের প্রতিটি জিনিসই একটি বস্তু, সুতরাং আপনি কোনও অ্যারে অবজেক্টের উপর নির্বিচার বৈশিষ্ট্য সেট করে " আপত্তি " করতে পারেন can যদিও এটি ক্ষতিকারক হিসাবে বিবেচনা করা উচিত । অ্যারে হ'ল সংখ্যাসূচক ইনডেক্সড ডেটার জন্য - অ-সংখ্যাযুক্ত কীগুলির জন্য, একটি অবজেক্ট ব্যবহার করুন use

অ-সংখ্যাসূচক কীগুলি কোনও অ্যারে "ফিট করে না" কেন এটি এখানে আরও একটি দৃ concrete় উদাহরণ:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

alert(myArray.length);

এটি '2' প্রদর্শন করবে না, তবে '0' - কার্যকরভাবে অ্যারেতে কোনও উপাদান যুক্ত করা হয়নি, অ্যারে অবজেক্টে কিছু নতুন বৈশিষ্ট্য যুক্ত হয়েছে।


4
myArray.length অ্যারেতে সর্বশেষ উপাদানের একটি সংখ্যা সূচক / কী প্রদান করে তবে উপাদানগুলির প্রকৃত সংখ্যা নয়। অ্যারে অবজেক্টের বৈশিষ্ট্যগুলি কি অ্যারে মানের মতো নয়?
দশা সালো

1
আমি কেবল অ্যারে অবজেক্টের অভিপ্রায়িত শব্দার্থকে চিত্রিত করার চেষ্টা করছিলাম যদি আপনি কেবল এটি কোনও নিয়মিত বস্তুর মতো আচরণ করেন। লিঙ্কযুক্ত নিবন্ধটি আরও ভাল কাজ করেছে :)
পল ডিকসন

13
পরের বার কেউ বলে জাভাস্ক্রিপ্টটি বিকাশের জন্য ভাল ভাষা, আমি তাকে এই নমুনাটি দেখাব। ধন্যবাদ.
অলিভিয়ার পন্স

@ অলিভিয়ার, আপনি যাকে "বাগ" বলছেন তা দুর্দান্ত একটি বৈশিষ্ট্যও হতে পারে। আপনি তাদের বিষয়বস্তু বা দৈর্ঘ্য প্রভাবিত না করেই এবং তাদের সঙ্গে বস্তু মোড়ানো করেও অ্যারে করার জন্য একটি বাজে ও বিবরণ যোগ করতে পারেন title, descriptionএবং itemsবৈশিষ্ট্য। এটি আপনার ভাষা কতটা ভাল জানেন এবং আপনি কীভাবে ব্যবহার করেন তার উপর নির্ভর করে।
টাও

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

14

জেএস অ্যারেতে অবজেক্টস রয়েছে, কিছুটা পরিবর্তিত হয়েছে (আরও কয়েকটি ফাংশন সহ)।

কার্যাদি যেমন:

concat
every   
filer
forEach
join
indexOf
lastIndexOf
map
pop
push
reverse
shift
slice
some
sort
splice
toSource
toString
unshift
valueOf 

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

6

আমি মনে করি, আমিও পূর্ববর্তী উত্তর সহ রূপক এবং রহস্যময়। স্পষ্টতা অনুসরণ।

অ্যারের উদাহরণ, বুলিয়ান, তারিখ, ফাংশন, সংখ্যা, RegExp, স্ট্রিং একটি অবজেক্ট তবে প্রতিটি ধরণের নির্দিষ্ট পদ্ধতি এবং বৈশিষ্ট্য সহ বর্ধিত। উদাহরণস্বরূপ, অ্যারের একটি পূর্বনির্ধারিত lengthসম্পত্তি রয়েছে যখন জেনেরিক বস্তুগুলি না থাকে।

javascript:alert([].length+'\n'+{}.length)

প্রদর্শন

0
অনির্দিষ্ট

স্বতঃস্ফূর্তভাবে, এফএফ গেকো দোভাষী এছাড়াও অ্যারে এবং জেনেরিক অবজেক্টের মধ্যে আলাদা আলাদা পার্থক্য সহ ভাষা নির্মাতাকে মূল্যায়ন করে।

javascript:
  ra=[  "one",   "two",   "three"]; ra.a=4;
  ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
  alert(
    ra            +"\n\n"+
    ob            +"\n\n"+
    ra.toSource() +"\n\n"+
    ra.a          +"\t .toSource() forgot me! \n\n"+
    ra.length     +"\t and my length! \n\n"+
    ob.toSource());
  ps=""; for(i in ra)ps+=i+" "; alert(ps);  /* NB .length is missing! */
  ps=""; for(i in ob)ps+=i+" "; alert(ps);

প্রদর্শক

এক দুই তিন

[অবজেক্ট অবজেক্ট]

["এক দুই তিন"]

4। টোসোর্স () আমাকে ভুলে গেছে! 

3 এবং আমার দৈর্ঘ্য! 

({0: "এক", 1: "দুই", 2: "তিন", a: 4})

এবং 0 1 2 aএবং 0 1 2 a

সমস্ত বস্তু ফাংশন হয় এমন বিবৃতি সম্পর্কিত:

এটা তন্ন তন্ন চিহ্নগুলি সিন্টেক্সের না শব্দার্থগতভাবে সঠিক মত একটি ফাংশন হিসাবে একটি অবাধ বস্তুর উদাহরণস্বরূপ ব্যবহার করা 123()বা "abc"()বা []()বা {}()বা obj()যেখানে objকোন প্রকার ছাড়া অন্য রয়েছে Functionযাতে একটি অবাধ বস্তুর উদাহরণস্বরূপ একটি নয়, Function। যাইহোক, একটি বস্তুর দেওয়া objএবং এটি ধরন যেমন Array, Boolean, Date, ..., কিভাবে হয়নি objএকটি হতে আসা Array, Boolean, Date, ...? একটি কি Array, Boolean, Date, ...?

javascript:
    alert([Array, Boolean, Date, Function, 
              Number, Object, RegExp, String] . join('\n\n') );

প্রদর্শন

function Array() {
    [native code]
}

function Boolean() {
    [native code]
}

function Date() {
    [native code]
}

function Function() {
    [native code]
}

function Number() {
    [native code]
}

function Object() {
    [native code]
}

function RegExp() {
    [native code]
}

function String() {
    [native code]
}

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

একটি কার্যকরী এবং অবজেক্টের দৃষ্টান্ত উভয়ই জেএস ইন্টারপ্রিটার নিম্ন স্তরের অন্তর্নির্মিত আদিমগুলির যেমন Mathএবং JSONএবং হিসাবে প্রোগ্রামিং এবং প্রয়োগের জন্য মৌলিক বলে মনে হয় true

 javascript:alert([Math, JSON, true.toSource()].join("\n\n"));

প্রদর্শন

[object Math]

[object JSON]

(new Boolean(true))

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


ফাংশনটির জন্য অবজেক্টের সংজ্ঞাটি বিশেষভাবে সন্তোষজনক কারণ এটি পুনরাবৃত্তির সম্পর্ক হিসাবে সংজ্ঞায়িত হয়! এটি নিজস্ব সংজ্ঞা ব্যবহার করে সংজ্ঞায়িত!

function Function() { [native code] }
এবং যেহেতু কোনও ফাংশন একটি অবজেক্ট তাই একই অনুভূতি ধারণ করে
function Object() { [native code] }

অন্যান্য সংজ্ঞাগুলির বেশিরভাগ স্থির টার্মিনাল মানকে শান্ত করে। তবে, eval()এটি একটি বিশেষ ক্ষমতাশালী আদিম এবং সুতরাং একটি স্ট্রিং এছাড়াও স্বেচ্ছাসেবী কার্যকারিতা এম্বেড করতে পারে।

আবার নোট করুন, উপরে ব্যবহৃত ভাষাগুলি অবজেক্টের ধরণ এবং উদাহরণের পার্থক্যকে অস্পষ্ট করে।


5

জাভাস্ক্রিপ্টের সমস্ত কিছু আদিম ধরণের পাশাপাশি একটি বস্তু।

কোড

var myArray = Array();

যখন অ্যারে অবজেক্টের উদাহরণ তৈরি করে

var myObject = {'A': 'Athens', 'B':'Berlin'};

অবজেক্ট অবজেক্টের উদাহরণ তৈরি করে।

নিম্নলিখিত কোড ব্যবহার করে দেখুন

alert(myArray.constructor)
alert(myObject.constructor)

সুতরাং আপনি দেখতে পাবেন যে পার্থক্যটি অবজেক্ট কনস্ট্রাক্টরের ধরণের।

অ্যারে অবজেক্টের উদাহরণে অ্যারের প্রোটোটাইপের সমস্ত বৈশিষ্ট্য এবং পদ্ধতি থাকবে।


2

জাভাস্ক্রিপ্টে অ্যারে এবং অন্যান্য বস্তুর মধ্যে পার্থক্য। অ্যারেগুলিতে ম্যাজিক্যালি আপডেটিংয়ের দৈর্ঘ্যের সম্পত্তি থাকলেও অ্যারে ব্যতীত অন্য অবজেক্টের জন্য এ জাতীয় সম্পত্তি প্রয়োগের কোনও উপায় নেই।

var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6

অ্যারিনালকে সূচিপত্রের সাথে জিনিসগুলি সঞ্চয় করতে ব্যবহার করা হয় - এটি একটি traditionalতিহ্যবাহী অ্যারে, স্ট্যাক বা সারির মতো ব্যবহার করুন। একটি বস্তু হ্যাশ - এটি একটি পৃথক কী আছে এমন ডেটার জন্য ব্যবহার করুন।


2

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

সাবধানতা অবলম্বন করুন যে আপনি যদি সেই Arrayবৈশিষ্ট্যগুলির পরিবর্তে নামযুক্ত বৈশিষ্ট্যগুলির সাথে একটি ব্যবহার করতে চান তবে Objectকোনও for...ofলুপে অ্যাক্সেসযোগ্য হবে না এবং জেএসএন এটি পাস করার জন্য এনকোডিং করলে আপনি অপ্রত্যাশিত ফলাফলও পেতে পারেন। নীচের উদাহরণটি দেখুন যেখানে সমস্ত অ-সংখ্যাসূচক সূচকগুলি উপেক্ষা করা হয়:

let arr = [];
let obj = {};

arr['name'] = 'John';
obj['name'] = 'John';

console.log(arr);    // will output [name: "John"]
console.log(obj);    // will output {name: "John"}

JSON.stringify(arr); // will return [] <- not what you expected
JSON.stringify(obj); // will return {"name":"John"}

-1

{}-Notation কোড সুন্দর করতে আপনাকে মাত্র সিনট্যাক্স চিনি হয় ;-)

জাভাস্ক্রিপ্টে অনেকগুলি অনুরূপ নির্মাণ রয়েছে যেমন ফাংশন নির্মাণ, যেখানে ফাংশন () কেবলমাত্র একটি প্রতিশব্দ

var Func = new Function("<params>", "<code>");

3
ফাংশন কনস্ট্রাক্টর ফাংশন আক্ষরিক জন্য প্রতিশব্দ নয় । আক্ষরিকটি লেক্সিকালি স্কোপড থাকে যখন কনস্ট্রাক্টর গ্লোবাল থাকে। {}আক্ষরিক অবজেক্ট স্বরলিপি, []আক্ষরিক অ্যারে, আমি নিশ্চিত না যে আপনার উত্তরের মূল বিষয়টি কী।
হুয়ান মেন্ডেস

এছাড়াও, কোনও কোড কার্যকর করার আগে ঘোষিত ফাংশনগুলি উপলভ্য থাকে, ফাংশন কনস্ট্রাক্টর ব্যবহার করে অ্যাসাইনমেন্টগুলি কোড তৈরি করে না যতক্ষণ না তাদের কার্যকর করে until
রবজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.