একটি জাভাস্ক্রিপ্ট অ্যারে ঘোষণা করার সময় "অ্যারে ()" এবং "[]" এর মধ্যে পার্থক্য কী?


841

এটির মতো অ্যারে ঘোষণার মধ্যে আসল পার্থক্য কী:

var myArray = new Array();

এবং

var myArray = [];

[]টোকেনটি: ARRAY_INIT; new Arrayটি টোকেন: NEW, IDENTIFIER; new Array()টোকেন:NEW, IDENTIFIER, CALL
noobninja

উত্তর:


951

পার্থক্য আছে, তবে সেই উদাহরণে কোনও পার্থক্য নেই।

আরও ভার্বোজ পদ্ধতি ব্যবহার করে: new Array()প্যারামিটারগুলিতে একটি অতিরিক্ত বিকল্প রয়েছে: আপনি যদি কোনও সংখ্যক কনস্ট্রাক্টরের কাছে পাস করেন তবে আপনি সেই দৈর্ঘ্যের একটি অ্যারে পাবেন:

x = new Array(5);
alert(x.length); // 5

অ্যারে তৈরির বিভিন্ন উপায় বর্ণনা করার জন্য:

var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = [3]             // e.length == 1, e[0] == 3
    f = new Array(3),   // f.length == 3, f[0] == undefined

;

আর একটি পার্থক্য হ'ল new Array()আপনি যখন ব্যবহার করছেন তখন অ্যারের আকার নির্ধারণ করতে সক্ষম হবেন যা স্ট্যাকের আকারকে প্রভাবিত করে। আপনি যদি স্ট্যাকের ওভারফ্লোগুলি পেয়ে যাচ্ছেন ( অ্যারে.পুশ বনাম অ্যারে.উনশিফ্টের পারফরম্যান্স ) পান তবে এটি কার্যকর হবে যা অ্যারের আকার স্ট্যাকের আকারের চেয়ে বেশি হয়ে যায় এবং এটি আবার তৈরি করতে হয়। সুতরাং ব্যবহারের ক্ষেত্রে নির্ভর করে, ব্যবহারের সময় একটি কার্যকারিতা বৃদ্ধি new Array()করতে পারে কারণ আপনি ওভারফ্লোটি ঘটতে বাধা দিতে পারেন।

এই উত্তরে নির্দেশিত হিসাবে , অ্যারেতে new Array(5)পাঁচটি undefinedআইটেম যুক্ত হবে না । এটি কেবল পাঁচটি আইটেমের জন্য স্থান যুক্ত করে। সচেতন থাকুন যে Arrayএই উপায়টি array.lengthব্যবহার করা গণনার উপর নির্ভর করা কঠিন করে তোলে ।


66
এটি কিছুটা ভুল। নতুন অ্যারে () এবং [] এর মধ্যে একটি খুব গুরুত্বপূর্ণ পার্থক্য আছে আমি আমার উত্তরটি বিস্তারিতভাবে বর্ণনা করব।
কোডারজয়ে

30
তবে আপনার উত্তরে উল্লিখিত হিসাবে, আপনি সম্পূর্ণ উন্মাদ এবং অ্যারে ফাংশনটি ওভাররাইট করলেই কেবল এটি ভিন্ন?
নিকফ

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

5
একটি বিশাল পারফরম্যান্স পার্থক্য রয়েছে: jsperf.com/create-an-array-of-initial-size/2
মার্কো লুগলিও

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

774

অন্তর্নির্মিত অ্যারে এবং অ্যারে নির্মাণকারী দ্বারা একটি অ্যারে তৈরি করার মধ্যে পার্থক্যটি সূক্ষ্ম তবে গুরুত্বপূর্ণ।

আপনি যখন একটি অ্যারে ব্যবহার করে তৈরি করবেন

var a = [];

আপনি দোভাষীকে একটি নতুন রানটাইম অ্যারে তৈরি করতে বলছেন। কোনও অতিরিক্ত প্রক্রিয়া করার প্রয়োজন নেই। সম্পন্ন.

আপনি যদি ব্যবহার করেন:

var a = new Array();

আপনি দোভাষীকে বলছেন, আমি কনস্ট্রাক্টরকে কল করতে চাই "Array " এবং একটি অবজেক্ট তৈরি । এটির পরে নির্বাহককে কল করার সন্ধান করতে এবং আপনার অ্যারে তৈরি করে এটি কল করার জন্য এটি কার্যকর করা প্রসঙ্গে দেখা যায় looks

আপনি ভাবতে পারেন "আচ্ছা, এগুলি মোটেই কিছু যায় আসে না They এরা একই রকম!"। দুর্ভাগ্যক্রমে আপনি যে গ্যারান্টি দিতে পারেন না।

নিম্নলিখিত উদাহরণটি ধরুন:

function Array() {
    this.is = 'SPARTA';
}

var a = new Array();
var b = [];

alert(a.is);  // => 'SPARTA'
alert(b.is);  // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)

উপরের উদাহরণে, প্রথম কলটি 'স্পার্টা' কে সতর্ক করবে যেমনটি আপনি আশা করেছিলেন। দ্বিতীয়টি করবে না। আপনি অপরিবর্তিত দেখতে শেষ হবে। আপনি আরও খেয়াল করতে পারেন যে বিতে নেটিভ অ্যারে অবজেক্টের সমস্ত ফাংশন রয়েছে যেমন pushঅন্যটি না করে।

আপনি যখন এটি হতে পারে আশা করতে পারেন, এটি কেবল সেই সত্যটি চিত্রিত করে যা এর []মতো নয়new Array()

[]আপনি যদি জানেন যে আপনি কেবল একটি অ্যারে চান তবে কেবল এটি ব্যবহার করা ভাল । আমি আরে ঘুরে ঘুরে এবং নতুন সংজ্ঞা দেওয়ার পরামর্শ দিচ্ছি না ...


156
ঠিক আছে, আমি মনে করি জেনে রাখা ভাল। কোন ধরণের ব্যক্তি অ্যারে ক্লাসটি ওভাররাইট করবে, আমি জানি না ...
নিকফ

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

51
জাভাস্ক্রিপ্টের মাধ্যমে যে ধরণের বৈশ্বিক দূষণ সম্ভব তা এর ভাল উদাহরণ।
ডেভিড স্নাবেল-কাউন্ট

8
লক্ষণীয় যে নতুন অ্যারে (আকার) অন্যান্য সম্ভাব্য পদ্ধতির তুলনায় [] স্বরলিপি ব্যবহার করে দ্রুত। সূত্র: jsperf.com/create-an-array-of-initial-size/2
মার্কো লুগলিও

9
দুর্ভাগ্যক্রমে যে পরীক্ষাটি ভুলভাবে প্রস্তুত। এটি অ্যারের সূচনা সহ অ্যারে অ্যাক্সেসের পরে অ্যারের সূচনা পরীক্ষা করছে। ব্রাউজারগুলি আসলে মেমরিটিকে প্রাক-বরাদ্দ করছে তা প্রমাণ করার কোনও নিয়ন্ত্রণ নেই (যা স্পেসিফিকেশন বলে না যে তাদের অবশ্যই করতে হবে)। যদি আমরা ধরে নিতে পারি যে অ্যারে অ্যাক্সেস অবিচ্ছিন্ন এবং বেশিরভাগ সময় উভয় উদাহরণে মেমরি বরাদ্দ করতে ব্যয় করা হয় তবে আপনি লক্ষ লক্ষ অ্যারে ইনস্ট্যান্ট করে দিলে [] আরও ভাল। jsperf.com/array-instanciation
কোডারজয়

95

একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে যা কোনও উত্তর এখনও উল্লেখ করেনি।

এটা থেকে:

new Array(2).length           // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true

আপনি সম্ভবত new Array(2)সমান বলে মনে করতে পারেন [undefined, undefined], কিন্তু এটি না!

এর সাথে চেষ্টা করুন map():

[undefined, undefined].map(e => 1)  // [1, 1]
new Array(2).map(e => 1)            // "(2) [undefined × 2]" in Chrome

দেখা? শব্দার্থবিজ্ঞান সম্পূর্ণ আলাদা! তাহলে কেন?

ইএস 6 স্পেক 22.1.1.2 অনুসারে, কাজটি Array(len)কেবল একটি নতুন অ্যারে তৈরি করছে যার সম্পত্তি lengthযুক্তিতে সেট করা আছে lenএবং এটি এটি, যার অর্থ কোনও আসল উপাদান নেই এই সদ্য নির্মিত অ্যারের ভিতরে ।

ফাংশন map(), অনুমান অনুযায়ী 22.1.3.15 প্রথমে HasPropertyকলব্যাক কল করে চেক করবে , তবে দেখা যাচ্ছে যে:

new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true

এবং এজন্যই আপনি যে কোনও পুনরাবৃত্তি ফাংশনগুলি তৈরি করা অ্যারেতে যথারীতি কাজ করতে পারবেন তা আশা করতে পারবেন না new Array(len)

বিটিডাব্লু, সাফারি এবং ফায়ারফক্সের এই অবস্থার জন্য আরও একটি "মুদ্রণ" রয়েছে:

// Safari
new Array(2)             // [](2)
new Array(2).map(e => 1) // [](2) 
[undefined, undefined]   // [undefined, undefined] (2) 

// Firefox
new Array(2)             // Array [ <2 empty slots> ]
new Array(2).map(e => 1) // Array [ <2 empty slots> ]
[undefined, undefined]   // Array [ undefined, undefined ]

আমি ইতিমধ্যে ক্রোমিয়ামে একটি সমস্যা জমা দিয়েছি এবং তাদের এই বিভ্রান্তিকর মুদ্রণটি ঠিক করতে বলছি: https://bugs.chromium.org/p/chromium/issues/detail?id=732021

আপডেট: এটি ইতিমধ্যে ঠিক করা হয়েছে। ক্রোম এখন এই হিসাবে মুদ্রিত:

new Array(2)             // (2) [empty × 2]

22
আপনার একমাত্র আসল উত্তর
ভিক্টর

এটি উপলব্ধি করে, আমি কেবলমাত্র একটি অন্যরকম কনস্ট্রাক্টে ডুব দিয়েছি [...Array(2)]যার জন্য নথিভুক্ত রেফারেন্সগুলি খুঁজে পাচ্ছি না: যা [undefined, undefined]ফলাফলের দৃষ্টিকোণ থেকে সমান ।
রবার্তো আন্দ্রেড

আমার আগের মন্তব্যের উত্তরটি "স্প্রেড অপারেটর" বলে মনে হচ্ছে: javascript.info/rest-paraters-spread-operator
রবার্তো অ্যান্ড্রেড

@ রুর্তোআরান্দ যে বুঝতে পেরেছেন কারণ স্প্রেড অপারেটরকে এন্ট্রিগুলি পড়তে হবে যাতে এটি অনুলিপি প্রয়োগ করতে পারে ... এবং undefinedযথারীতি খালি স্লট রিটার্ন পড়া ।
হাক্স

51

অদ্ভুতভাবে যথেষ্ট, ক্রোমের new Array(size)তুলনায় প্রায় 2x দ্রুত []এবং এফএফ এবং আইই ( প্রায়শই একটি অ্যারে তৈরি করে এবং পূরণ করে) faster আপনি যদি অ্যারের আনুমানিক আকার জানেন তবে এটি কেবল গুরুত্বপূর্ণ। আপনি যে দৈর্ঘ্যের চেয়ে বেশি আইটেম যুক্ত করেছেন তা পারফরম্যান্সের বুস্টটি হারাবে।

আরও সঠিকভাবে: Array(একটি দ্রুত ধ্রুবক সময় অপারেশন যা কোনও মেমরি বরাদ্দ করে না, ভেরাস []একটি রৈখিক সময় অপারেশন যা প্রকার এবং মান নির্ধারণ করে।


3
আমি নোড.জেজে এটি পরীক্ষা করেছি: যখন আপনাকে new Array(length)0 <= আকার <= ~ 1000, আকারে> ~ 1000 জিততে কিছু পরিমাণ আইটেম অ্যারে []
রাখতে হবে

1
এই পরীক্ষা stackoverflow.com/questions/7375120/...
Xsmael

40

আরও তথ্যের জন্য, নীচের পৃষ্ঠাটি আপনাকে কখনই ব্যবহারের প্রয়োজন হবে না তা বর্ণনা করেnew Array()

আপনার কখনই new Object()জাভাস্ক্রিপ্টে ব্যবহার করার দরকার নেই । {} পরিবর্তে অবজেক্টটি আক্ষরিক ব্যবহার করুন। একইভাবে, পরিবর্তে new Array()অ্যারের আক্ষরিক ব্যবহার করবেন না []। জাভাস্ক্রিপ্টে অ্যারে জাভাতে অ্যারের মতো কিছুই কাজ করে না এবং জাভা-এর মতো সিনট্যাক্স ব্যবহার আপনাকে বিভ্রান্ত করবে।

ব্যবহার করবেন না new Number, new Stringঅথবা new Boolean। এই ফর্মগুলি অপ্রয়োজনীয় বস্তু মোড়ক উত্পাদন করে। পরিবর্তে কেবল সহজ আক্ষরিক ব্যবহার করুন।

এছাড়াও মন্তব্যগুলি পরীক্ষা করে দেখুন - new Array(length)ফর্মটি কোনও কার্যকর উদ্দেশ্য উপস্থাপন করে না (কমপক্ষে জাভাস্ক্রিপ্টের আজকের বাস্তবায়নে)।


3
ক্রকফোর্ডও নতুন অ্যারে () ব্যবহার না করে [] ব্যবহার করতে বলেছে। দুর্ভাগ্যক্রমে, তিনি লিঙ্কযুক্ত নিবন্ধে কেন বলেন না। আমি ধরে নিলাম এটি কেবল স্থান এবং গতির বিষয়। javascript.crockford.com/code.html
নসরেডা

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

@ অ্যালান স্টর্ম: কমপক্ষে সংখ্যা, স্ট্রিং এবং বুলিয়ানের জন্য তিনি বলেছেন যে "এই ফর্মগুলি অপ্রয়োজনীয় বস্তু মোড়কে উত্পাদন করে", তবে আমার ধারণা এটি অ্যারের ক্ষেত্রে প্রযোজ্য না।
বেয়ারলিফিটস

10

যাতে আরও ভাল বোঝার জন্য []এবং new Array():

> []
  []
> new Array()
  []
> [] == []
  false
> [] === []
  false
> new Array() == new Array()
  false
> new Array() === new Array()
  false
> typeof ([])
  "object"
> typeof (new Array())
  "object"
> [] === new Array()
  false
> [] == new Array()
  false

উপরের ফলাফলটি উইন্ডোজ 7 এ গুগল ক্রোম কনসোল থেকে এসেছে।


4
তবে কেন [] == [] বা [] === [] মিথ্যা?
আনু

5
"অবজেক্টগুলির সাথে তুলনা করার একটি অভিব্যক্তি কেবলমাত্র সত্য যদি অপারেন্ডগুলি একই অবজেক্টটির উল্লেখ করে।" (উত্স: ডেভেলপার.মোজিলা.আর.ইন-
ইউএস

এই উত্তর চেরি উদাহরণ দুটি বোঝায় যে দুটি নির্মাণ একই রকম। এই পৃষ্ঠার অন্যান্য পোস্টগুলি যেমন পার্থক্যগুলি নির্দেশ করে, যেমনটি হয় Array(3)বা new Array(3)তেমন হয় না [3]
ggorlen

8

প্রথমটি হ'ল ডিফল্ট অবজেক্ট কনস্ট্রাক্টর কল। আপনি চাইলে এর পরামিতিগুলি ব্যবহার করতে পারেন।

var array = new Array(5); //initialize with default length 5

দ্বিতীয়টি আপনাকে খালি অ্যারে না তৈরি করার ক্ষমতা দেয়:

var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.

1
আপনি ভার্বোজ কনস্ট্রাক্টর দিয়ে একই জিনিসটি করতে পারেন: var অ্যারে = নতুন অ্যারে (1, 2, 3);
নিকফ

সুতরাং আমি অনুমান করি আপনি var array = [5]বর্গাকার বন্ধনী ব্যবহার করে কিন্তু নির্মাণকারীর ব্যবহার না করে var array = Array(5)5 উপাদানগুলির খালি অ্যারে তৈরি করতে পারেন।
সিডিএমকেই

সিডিএমকেয়ে - এটি ভুল। var a = [5] একক আইটেমের সাথে একটি অ্যারে হবে - পাঁচ নম্বর।
বেয়ারলিফিটস

2
@ ব্যারলিফিটস: আমি যা বলেছিলাম তা তাই। বোগডানসের উত্তরে তিনি বলেছিলেন যে অ্যারের সূচনা করতে কনস্ট্রাক্টর কলটি ব্যবহার করা যাবে না, তবে তিনি ভুল ছিলেন। আমার মন্তব্যটি কেবল স্পষ্ট করার জন্য ছিল যে আপনি একটি একক উপাদানের অ্যারে শুরু করতে কনস্ট্রাক্টর কলটি ব্যবহার করতে পারবেন না।
সিডিএমকেই

1
@ সিডিএমকেয়ে: দুঃখিত, আমি আপনার মন্তব্যটি ভুল বুঝেছি। স্পষ্ট করার জন্য: নতুন অ্যারে (আরগ) - আরগ সংখ্যাসূচক হলে এটি দৈর্ঘ্য = আরগ দিয়ে ফাঁকা অ্যারে তৈরি করে; নতুন অ্যারে (arg1, arg2) - একটি নতুন অ্যারে তৈরি করে এবং অ্যারের উপাদানগুলির সূচনা করে। সুতরাং আপনি যদি [5] এর মতো একটি সংখ্যাসূচক উপাদান সহ একটি অ্যারে তৈরি করতে চান তবে আপনি নতুন অ্যারে (5) ব্যবহার করে এটি করতে পারবেন না। তবে সত্যিই আপনার কখনই নতুন অ্যারে () ব্যবহার করা উচিত নয় সুতরাং এটি একটি মূল বিষয়।
ব্যারলিফিটস

5

ফ্রেড্রিকের ভালটির উপর ভিত্তি করে এই উদাহরণটি দিয়ে শুরু করে আমি আরও নির্দিষ্ট উপায়ে ব্যাখ্যা করতে পারি।

var test1 = [];
test1.push("value");
test1.push("value2");

var test2 = new Array();
test2.push("value");
test2.push("value2");

alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);

আমি অ্যারেগুলিতে আরও একটি মান যুক্ত করেছি, এবং চারটি সতর্কতা করেছি: মানগুলি সম্পর্কে নিশ্চিত হওয়ার জন্য প্রথম এবং দ্বিতীয়টি হ'ল প্রতিটি অ্যারেতে সঞ্চিত মান আমাদের দেওয়া। তারাও আবার ফিরে আসবে! এখন তৃতীয়টি চেষ্টা করুন, এটি মিথ্যা প্রত্যাবর্তন করবে, কারণ এটি

জেএস টেস্ট 1 কে একটি ডেটা টাইপের অ্যারে দিয়ে ভেরিয়েবল হিসাবে বিবেচনা করে , এবং এটি একইরূপে test2 | একটি যেমন একটি অ্যারের বৈশিষ্ট্য সহ অবজেক্ট , এবং কয়েক অসম্মান পার্থক্য এখানে।

প্রথম পার্থক্যটি যখন আমরা টেস্ট 1 বলি তখন এটি ভেবে ভেবে চলককে কল করে, এটি কেবল এই মানগুলিকে ফিরিয়ে দেয় যা এই ভেরিয়েবলটিতে সংরক্ষণ করা হয় যা তার ডেটা টাইপকে উপেক্ষা করে! কিন্তু, যখন আমরা টেস্ট 2 বলি তখন এটি অ্যারে () ফাংশনটিকে কল করে এবং তারপরে এটি আমাদের "পুশড" মানগুলিকে তার "মান" বৈশিষ্ট্যে সংরক্ষণ করে এবং যখন আমরা পরীক্ষা 2 সতর্ক করি তখন এটি অ্যারে অবজেক্টের "মান" বৈশিষ্ট্যটি প্রদান করে।

সুতরাং যখন আমরা পরীক্ষা করি যে টেস্ট 1 অবশ্যই টেস্ট 2 এর সমান হয় তবে তারা কখনই সত্য হয় না, একটি ফাংশন এবং অন্যটি একটি ভেরিয়েবল (এক ধরণের অ্যারে সহ), এমনকি যদি তাদের মান একই থাকে!

এটি সম্পর্কে নিশ্চিত হতে, 4 তম সতর্কতা চেষ্টা করুন, মূল্যটি এতে যুক্ত হয়েছে; এটা সত্য ফিরে আসবে। এই ক্ষেত্রে আমরা জেএসকে বলি "কনটেইনার ধরণের বিষয়টি উপেক্ষা করা, এটি কার্যকর ছিল বা পরিবর্তনশীল, দয়া করে প্রতিটি পাত্রে সঞ্চিত মানগুলি তুলনা করুন এবং আপনি কী দেখেছেন তা আমাদের জানান!" ঠিক তাই ঘটে।

আমি আশা করি আমি এর পিছনে ধারণাটি পরিষ্কারভাবে বলেছি, এবং আমার খারাপ ইংরেজির জন্য দুঃখিত।


19
এটি আশ্চর্যজনক যে এই ধরণের সম্পূর্ণ এবং নিখুঁত বাজে ভোট দেওয়া হয়েছে। অ্যারেগুলির মধ্যে তুলনাটি আপনার পক্ষে কীভাবে তৈরি করা যায় তা মিথ্যা হবে কারণ এটি বস্তুর পরিচয়টির তুলনা করে এবং তারা বিভিন্ন বস্তু। অ্যারেগুলির কোনও মূল্য সম্পত্তি নেই। []এবং new Array()অভিন্ন; .valueহতে হবে undefinedউভয় ক্ষেত্রেই, এবং তাদের তুলনা সবসময় মিথ্যা হবে।
22-22 এ পিছলে

সম্মত, এই উত্তরটির কোনও অর্থ নেই এবং কিছুই দেখায় না। তেমন কিছুই নেই array.value। এবং উভয় typeof []এবং typeof new Array()ফিরে object। এটি একটি কারণ হওয়ার কারণগুলির মধ্যে একটিArray.isArray
gman

4

আপনি কোনও দৈর্ঘ্য ছাড়াই অ্যারে শুরু করার সময় কোনও পার্থক্য নেই। সুতরাং var a = []এবং var b = new Array()একই।

আপনি যদি দৈর্ঘ্যের মতো অ্যারের সূচনা করেন তবে var b = new Array(1);এটি অ্যারের অবজেক্টের দৈর্ঘ্য 1 তে সেট করবে So সুতরাং এর সমতুল্য var b = []; b.length=1;

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

var b = new Array(1);
b.push("hello world");
console.log(b.length); // print 2

বনাম

var v = [];
a.push("hello world");
console.log(b.length); // print 1

3

প্রথমটি হ'ল ডিফল্ট অবজেক্ট কনস্ট্রাক্টর কল most প্রায়শই গতিশীল মানগুলির জন্য ব্যবহৃত হয়।

var array = new Array(length); //initialize with default length

স্থির মান তৈরি করার সময় দ্বিতীয় অ্যারে ব্যবহার করা হয়

var array = [red, green, blue, yellow, white]; // this array will contain values.

3

কোনও বড় পার্থক্য নেই, তারা মূলত একই জিনিসটি করে তবে তাদের বিভিন্ন উপায়ে করে, তবে পড়ুন, ডাব্লু 3 সি-তে এই বিবৃতিটি দেখুন:

var cars = ["Saab", "Volvo","BMW"];

এবং

var cars = new Array("Saab", "Volvo", "BMW");

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

তবে একই সময়ে, new Arrayসিন্ট্যাক্সকে একটি খারাপ অনুশীলন হিসাবে বিবেচনা করে নতুন অ্যারে তৈরি করা :

নতুন অ্যারে এড়ানো ()

জাভাস্ক্রিপ্টের অন্তর্নির্মিত অ্যারে নির্মাণকারী নতুন অ্যারে () ব্যবহার করার দরকার নেই।
পরিবর্তে [] ব্যবহার করুন।
এই দুটি পৃথক বিবৃতি উভয় একটি নতুন খালি অ্যারে নামের পয়েন্ট তৈরি করে:

var points = new Array();         // Bad
var points = [];                  // Good 

এই দুটি পৃথক বিবৃতি উভয়ই একটি নতুন অ্যারে তৈরি করে 6 টি সংখ্যা:

var points = new Array(40, 100, 1, 5, 25, 10); // Bad    
var points = [40, 100, 1, 5, 25, 10];          // Good

নতুন শব্দ শুধুমাত্র কোড complicates। এটি কিছু অপ্রত্যাশিত ফলাফলও আনতে পারে:

var points = new Array(40, 100);  // Creates an array with two elements (40 and 100)

আমি যদি উপাদানগুলির একটি অপসারণ করি?

var points = new Array(40);       // Creates an array with 40 undefined elements !!!!!

সুতরাং মূলত সেরা অনুশীলন হিসাবে বিবেচনা করা হয় না, সেখানে একটি সামান্য পার্থক্যও রয়েছে, আপনি এটি পছন্দ করতে দৈর্ঘ্যটি পার করতে পারেন new Array(length), এটি একটি প্রস্তাবিত উপায়ও নয়।


হাই আলিরিজা, এগুলি কি কোথাও অনুলিপি করা হয়েছে এবং আটকানো হয়েছে? যেখানে লেখাটি অনুলিপি করা হয়েছে সেখানে দয়া করে একটি লিঙ্ক যুক্ত করুন। দেখুন এই সহায়তা কেন্দ্র পৃষ্ঠা বিস্তারিত জানার জন্য। ধন্যবাদ.
পাং

new Array(40).fill(123)
Gman

2

ব্যবহারের পার্থক্য

var arr = new Array(size);

অথবা

arr = [];
arr.length = size;

যেমন এই প্রশ্নে যথেষ্ট আলোচনা করা হয়েছে।

আমি গতির সমস্যাটি যুক্ত করতে চাই - বর্তমানের দ্রুততম উপায়টি google chromeদ্বিতীয়টি second

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

উদাহরণস্বরূপ - আমি উল্লেখ করেছি যে ২ য় বিকল্পটি 2 মিলিয়ন [অপস / সেকেন্ড] এ চলে chrome, তবে আপনি যদি এটি চেষ্টা করে দেখেন তবে আপনি mozilla dev.আশ্চর্যজনকভাবে 23 মিলিয়ন উচ্চ হার পাবেন।

যাই হোক, আমি তোমাকে একটা সময় একবার আউট এটি পরীক্ষা, যে, বিভিন্ন ব্রাউজারের (এবং মেশিন) এ, সাইট ব্যবহার করার সুপারিশ করছি যেমন


2

আমি থাকল জানেন U ফালি (অথবা অ্যারের অন্যান্য বিচারিক) -এর মত জানতে পারেন code1 .এবং code2 তোমার দর্শন লগ করা দেন এরে ও তার দৃষ্টান্ত :

code1:

[].slice; // find slice here
var arr = new Array();
arr.slice // find slice here
Array.prototype.slice // find slice here

code2:

[].__proto__ == Array.prototype; // true
var arr = new Array();
arr.__proto__ == Array.prototype; // true

উপসংহার:

যেমন আপনি অ্যারেটির একটি নতুন উদাহরণ দেখতে []এবং new Array()তৈরি করতে পারেন nd এবং তারা সকলেই এর থেকে প্রোটোটাইপ ফাংশন পানArray.prototype

তারা অ্যারেগুলির ভিন্ন ভিন্ন উদাহরণ so সুতরাং এটির কারণটি explain [] != []

:)


2

আমি [] ব্যবহার করে একটি অদ্ভুত আচরণে ব্যয় করেছি।

আমাদের ক্ষেত্রগুলির সাথে কিছু মান থেকে প্রাথমিকভাবে মডেল "ক্লাস" রয়েছে। উদাহরণ:

require([
  "dojo/_base/declare",
  "dijit/_WidgetBase",
], function(declare, parser, ready, _WidgetBase){

   declare("MyWidget", [_WidgetBase], {
     field1: [],
     field2: "",
     function1: function(),
     function2: function()
   });    
});

আমি দেখতে পেয়েছি যে ক্ষেত্রগুলি যখন []তখন শুরু করা হয় তখন এটি সমস্ত মডেল অবজেক্ট দ্বারা ভাগ করা হবে। একটিতে পরিবর্তন করা সমস্ত অন্যকে প্রভাবিত করে।

এটি তাদের সাথে আরম্ভ করে না new Array()। অবজেক্টের আরম্ভের জন্য একই ( {}নতুন বনাম Object())

টিবিএইচ আমি নিশ্চিত নই যে আমরা যে কাঠামোটি ব্যবহার করছিলাম সে সম্পর্কে এটি কোনও সমস্যা কিনা ( দোজো )


2

চোখের দেখা পাওয়া ছাড়াও এর আরও অনেক কিছুই রয়েছে। সর্বাধিক অন্যান্য উত্তর সঠিক কিন্তু ..

new Array(n)

  • ইঞ্জিনকে nউপাদানগুলির জন্য স্থান পুনরায় স্থান দেওয়ার অনুমতি দেয়
  • অ্যারে তৈরির জন্য অনুকূলিত
  • তৈরি অ্যারে চিহ্নিত করা হয়েছে অ্যারেগুলিকে স্পার্স যার মধ্যে কমপক্ষে পারফরম্যান্ট অ্যারে অপারেশন রয়েছে, কারণ প্রতিটি সূচী অ্যাক্সেসের সীমানা পরীক্ষা করতে হয়, মানটি বিদ্যমান কিনা তা দেখুন প্রোটোটাইপ শৃঙ্খলে হাঁটুন
  • যদি অ্যারেটি বিচ্ছিন্ন হিসাবে চিহ্নিত করা হয়, তবে কোনও উপায় ফিরে আসবে না (কমপক্ষে ভি 8 এ), এটি আপনার জীবদ্দশায় সর্বদা স্লো হবে, এমনকি আপনি এটিতে 1 মিমি বা 2 ঘন্টা পরে সামগ্রীতে (প্যাকযুক্ত অ্যারে) পূরণ করলেও কিছু যায় আসে না doesn't

[1, 2, 3] || []

  • তৈরি অ্যারে প্যাকড চিহ্নিত রয়েছে (আপনি যদি না ব্যবহার করেন deleteবা না করেন)[1,,3] সিনট্যাক্স না করেন)
  • অ্যারে অপারেশনগুলির জন্য অনুকূলিতকরণ (for .. , forEach,map , ইত্যাদি)
  • অ্যারে বাড়ার সাথে সাথে ইঞ্জিনটিকে স্থানটি পুনরুদ্ধার করতে হবে

এটি সম্ভবত পুরানো ব্রাউজার সংস্করণ / ব্রাউজারগুলির ক্ষেত্রে নয়।


-2

আমি দুটি নির্মাণের মধ্যে একটি পার্থক্য পেয়েছি যা আমাকে বেশ শক্ত করে তোলে।

ধরা যাক আমার আছে:

function MyClass(){
  this.property1=[];
  this.property2=new Array();
};
var MyObject1=new MyClass();
var MyObject2=new MyClass();

বাস্তব জীবনে, যদি আমি এটি করি:

MyObject1.property1.push('a');
MyObject1.property2.push('b');
MyObject2.property1.push('c');
MyObject2.property2.push('d');

আমি যা শেষ করি তা হ'ল:

MyObject1.property1=['a','c']
MyObject1.property2=['b']
MyObject2.property1=['a','c']
MyObject2.property2=['d']

ভাষার স্পেসিফিকেশন যা বলেছিল তা কী হবে তা আমি জানি না, তবে আমি যদি চাই যে আমার দুটি বস্তুর আমার অবজেক্টগুলিতে স্বতন্ত্র সম্পত্তি অ্যারে রয়েছে তবে আমাকে ব্যবহার করতে হবে new Array()


এই জেএসফিডাল দেখায় যে আউটপুটটি আপনি অ্যারে আক্ষরিক []এবং নির্মাতার সাথে প্রত্যাশা করে যা new Array()ফলস্বরূপ প্রতি অ্যারেতে এক আইটেমের ফলস্বরূপ। উপরে বর্ণিত ফলাফলটি শেষ করতে অবশ্যই আপনার কোডে অন্য কিছু চলছে।
গুলফ্লাম

বাকী, এটি কোনও ব্রাউজারে আমার জন্য হয় না। এই আচরণটি পেতে আপনাকে এই জাতীয় কিছু করতে হবে: var property1static=[]; function MyClass(){ this.property1=property1static; this.property2=new Array(); };
ডেভ বার্টন

-3

অ্যারে কনস্ট্রাক্টর ব্যবহার করে কাঙ্ক্ষিত দৈর্ঘ্যের একটি নতুন অ্যারে তৈরি হয় এবং প্রতিটি সূচককে অপরিজ্ঞাত করে পপুলেট করে, ভেরিয়েবলের জন্য নির্ধারিত একটি অ্যারে সূচক তৈরি করে যা আপনি এটির জন্য তথ্য দেন।


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