জাভাস্ক্রিপ্টে একটি অ্যারে ঘোষণা করার সময় অনুসরণ করার জন্য সেরা অনুশীলনগুলি কী কী?


176

যখন আমাকে একটি নতুন অ্যারে ঘোষণা করার দরকার হয় আমি এই স্বরলিপিটি ব্যবহার করি

var arr = new Array();

তবে অনলাইনে পরীক্ষার সময়, উদাহরণস্বরূপ jsbin এ , একটি সতর্কতা আমাকে "অ্যারে আক্ষরিক স্বরলিপি ব্যবহার করুন []" হিসাবে সংকেত দেয়।

আমি কনস্ট্রাক্টর ব্যবহার এড়াতে কোনও কারণ খুঁজে পাইনি। কোনও উপায়ে ব্যবহারের চেয়ে কম দক্ষ []? নাকি এটা খারাপ অভ্যাস?

var arr = [];পরিবর্তে ব্যবহার করার কোনও ভাল কারণ আছে var arr = new Array();?


5
দুজনেই ভাল আছেন। আপনি কেবল সংক্রমণে কিছু বাইট সংরক্ষণ করুন।
সিরকো

13
আসলেই পার্থক্য আছে। : এই পোস্টটিকে দেখতে পারবেন stackoverflow.com/q/2280285/921204
techfoobar

দ্রষ্টব্য: অ্যারে কেবল ওভাররাইট করা থাকলে পার্থক্য রয়েছে
crdx

@apkd কিছু ব্রাউজার সেখানে একটি উল্লেখযোগ্য কর্মক্ষমতা পার্থক্য
ঊষা

যথেষ্ট ফর্সা। লিঙ্কিত প্রশ্নে আমি তা দেখিনি।
সিআরডিএক্স

উত্তর:


260

প্রায় , মানুষ ব্যবহার var a = []কারণ ডগলাস Crockford তাই বলছেন

তার কারণগুলির মধ্যে অন্তর্দৃষ্টিহীন এবং বেমানান আচরণ অন্তর্ভুক্ত new Array():

var a = new Array(5);     // an array pre-sized to 5 elements long
var b = new Array(5, 10); // an array with two elements in it

নোট সঙ্গে কোন উপায় নেই new Array()শুধু সহ একটি বিন্যাস তৈরি করতে এক এতে প্রাক নির্দিষ্ট সংখ্যক উপাদান!

ব্যবহার []করা আসলে আরও কার্যকর, এবং খুব নিরাপদ ! Arrayকনস্ট্রাক্টরকে ওভাররাইট করা এবং এটিকে বিজোড় কাজ করা সম্ভব তবে আপনি এর আচরণটি ওভাররাইট করতে পারবেন না []

ব্যক্তিগতভাবে, আমি সর্বদা []বাক্য গঠন ব্যবহার করি এবং একইভাবে সর্বদা পরিবর্তে {}বাক্য গঠন ব্যবহার করি new Object()


5
"আপনি [] এর আচরণ ওভাররাইট করতে পারবেন না।" আপনি যদি এই বিষয়ে নিশ্চিত? আমি ভেবেছিলাম যে আপনি অ্যারে কনস্ট্রাক্টরকে প্রভাবিত করতে ওভাররাইট করতে পারেন [], এবং অবজেক্ট কনস্ট্রাক্টরকে affect affect প্রভাবিত করতে পারে, কমপক্ষে কিছু বাস্তবায়নে।
র্যান্ডম 832

11
@ র্যান্ডম 832 সম্ভবত পুরানো ব্রাউজারগুলিতে, তবে ইএস 5 এর সামঞ্জস্যপূর্ণ বাস্তবায়নের ক্ষেত্রে নয়, যেখানে অনুমানটি বলেছে যে []কোনও অভ্যন্তরীণ নির্মাতাকে ডেকেছে, Array.constructorসেই সময়ে মানটি যা ঘটবে তা নয় ।
Alnitak

5
বোনাস: অ্যারে লিটারালগুলিArray কনস্ট্রাক্টর ব্যবহার করে নতুন অ্যারে তৈরি করার চেয়ে অনেক বেশি দ্রুত : jsppha.com/new-array
ম্যাথিয়াস বাইনেস

@ ম্যাথিয়াসবাইনেন্স কেবল কখনও কখনও।
অরেঞ্জডোগ

অভ্যন্তরীণ কনস্ট্রাক্টর জিনিসটির কারণে EW @ the [] আলাদাভাবে কাজ করছে। অসম্পূর্ণতা সংরক্ষণের চেয়ে বেশি বিভ্রান্তি সৃষ্টি করবে। সম্পাদনা: আহ, সুরক্ষা উদ্বেগ। আমি এটা পাই.
এরিক রিপেন

48

একটি উল্লেখযোগ্য পার্থক্য হ'ল সর্বদা একটি নতুন অ্যারে তাত্ক্ষণিকভাবে চালিত করা []হবে , যেখানে একটি পৃথক বস্তু তৈরি করতে হাইজ্যাক করা যেতে পারে ।new Array

(function () {
    "use strict";
    var foo,
        bar;
    //don't do this, it's a bad idea
    function Array() {
        alert('foo');
    }
    foo = new Array();
    bar = [];
}());​

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

অস্বীকৃতি : Arrayনির্মাণকারীকে হাইজ্যাক করা ভাল ধারণা নয় ।


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

পাল্টা দাবি অস্বীকার: এটি বছরের পর বছর ধরে অ্যারে নির্মাণকারীকে বাড়ানোর জন্য অত্যন্ত সহায়ক এবং দরকারী।
এরিক পুনরায়

26

রক্ষণাবেক্ষণের জন্য, ব্যবহারের জন্য []

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

খালি অ্যারে ব্যবহার করুন []

var ns = [];
var names = [ 'john', 'brian' ];

এখানে যেমন দেখানো হয়েছে , খালি এবং কিছু পরিচিত উপাদানগুলির জন্য আক্ষরিক ব্যবহার করা অ্যারে কনস্ট্রাক্টরের চেয়ে দ্রুততর।

পরিচিত আকারের অ্যারের জন্য, ব্যবহার করুন new Array(size)

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

যেমন এখানে দেখানো হয়েছে

// fill an array with 100 numbers
var ns = new Array( 100 );
for ( var i = 0; i < 100; i++ ) {
    ns[i] = i;
}

এটি খুব ছোট অ্যারেগুলির জন্যও কাজ করে


12

না, খালি অ্যারেগুলির জন্য অন্যের তুলনায় একটি স্বরলিপি ব্যবহার করার আসলে কোনও কারণ নেই।

তবে বেশিরভাগ ব্রাউজার কনস্ট্রাক্টরকেx = []; কল করার চেয়ে কিছুটা ভাল পারফরম্যান্স দেখায় ।

আপনি যদি একটি নির্দিষ্ট আকার সঙ্গে একটি অ্যারের তৈরি করতে প্রয়োজন হয়, আপনি ধরনের প্রয়োজন ব্যবহার x = new Array(10);উদাহরণস্বরূপ, যা 10 সহ একটি বিন্যাস তৈরি করবে undefinedস্লট।


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

7
আমি পারফরম্যান্সের তুলনা করতে একটি জেএসপিফারফ একসাথে রেখেছি: jsperf.com/array-constructor-versus-literal । কমপক্ষে আমার জন্য উবুন্টুতে ক্রোম 20 এ, আক্ষরিকটি নির্মাণকারীর চেয়ে দ্বিগুণ দ্রুত।
স্টিভেন


jAndy, আপনি জাভাস্ক্রিপ্টে "10 খালি স্লট" দিয়ে একটি অ্যারে চাইবেন কেন? বাস্তবে, আপনি ঠিক একই জিনিসটি এর সাথে করতে পারেন: var অ্যারে = []; arr [9] = "ওমেগা"; ১. জেএসে অ্যারেগুলি সম্পূর্ণ গতিশীল, আপনি যে কোনও সূচকটি পছন্দ করতে পারেন তা উল্লেখ করতে পারেন এবং এটি কেবল "অপরিজ্ঞাত" হবে। এটি ঠিক যেমনটি আপনি বলছেন ঠিক তেমন: var অ্যারে = নতুন অ্যারে (10); -Arr [23]; ২. অ্যারের দৈর্ঘ্য সর্বোচ্চ মানতে সেট করতে চলেছে যা এর মধ্যে যে কোনও কিছু আছে, নির্বিশেষে কতগুলি অপরিজ্ঞাত স্লট এর মধ্যে রয়েছে। অথবা আপনি এটি সেট করতে পারেন, নিজেই। [] ক্যান্সার নিরাময় নাও করতে পারে, তবে এটি সামান্য-ভাল।
নর্গার্ড

7
  • var arr = [] অ্যারে / অবজেক্ট আক্ষরিক ব্যবহার করে
  • var arr = নতুন অ্যারে () অ্যারে / অবজেক্ট কনস্ট্রাক্টর ব্যবহার করুন

অ্যারে বা অবজেক্টের সংজ্ঞা দেওয়ার দ্রুততম উপায়টি আক্ষরিক উপায়, কারণ আপনাকে কনস্ট্রাক্টরকে কল করার দরকার নেই

var arr1 = new Array(1, 2, 3, 4);
var arr2 = [1, 2, 3, 4];

alert(arr1[0]); // 1
alert(arr2[0]); // 1

var arr3 = new Array(200);
var arr4 = [200];

alert(arr3[0]); // 'undefined'
alert(arr4[0]); // 200

2
রেফারেন্সের জন্য, পর্দার পিছনে, var arr = [];যৌক্তিকভাবে একটি নির্মাণকারীও ব্যবহার করে। এটি বর্তমানে সর্বদা অন্তর্নির্মিত অ্যারে কনস্ট্রাক্টরের পরিবর্তে বর্তমানে নাম অনুসারে যা চলছে তার চেয়ে বেশি Array
সিএওও

6

উভয়ই সঠিক। তবে বেশিরভাগ লোকই ব্যবহার করেvar a = []

জাভাস্ক্রিপ্টে একটি অ্যারে ঘোষণা করার তিনটি উপায়।

পদ্ধতি 1 : আমরা স্পষ্টভাবে জাভাস্ক্রিপ্ট "নতুন" কীওয়ার্ড সহ একটি অ্যারে মেমরিতে অ্যারে ইনস্ট্যান্ট করতে (যেমন এটি তৈরি করে এবং উপলভ্য করে তুলতে পারি) তা ঘোষণা করতে পারি।

// Declare an array (using the array constructor)
var arlene1 = new Array();
var arlene2 = new Array("First element", "Second", "Last");

পদ্ধতি 2 : অ্যারে ঘোষণার জন্য আমরা একটি বিকল্প পদ্ধতি ব্যবহার করি।

// Declare an array (using literal notation)
var arlene1 = [];
var arlene2 = ["First element", "Second", "Last"];

পদ্ধতি 3 : জাভাস্ক্রিপ্ট আপনাকে নির্দিষ্ট পদ্ধতিগুলিতে কল করে পরোক্ষভাবে অ্যারে তৈরি করতে দেয়।

// Create an array from a method's return value
var carter = "I-learn-JavaScript";
var arlene3 = carter.split("-");

4

কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে নিতে পারে এমন একটি সীমা রয়েছে।

বেশিরভাগ সিস্টেমে আমি হিটটার্ডের সীমাটি 2 ^ 16 (2 বাইট):

var myFreshArr = new Array(0,1,2,3 ..... 65536);

এটি ত্রুটির কারণ ঘটবে (অনেকগুলি আর্গুমেন্ট ....)

আক্ষরিক ব্যবহার করার সময় [] আপনার এ জাতীয় সমস্যা নেই।

আপনি যদি এ জাতীয় বড় অ্যারেগুলির বিষয়ে চিন্তা না করেন তবে আমি মনে করি আপনি যা পছন্দ করেন তা ব্যবহার করতে পারেন।


2
আপনি কি এর উদাহরণ দিয়ে যেতে পারেন যেখানে কোনও ব্যক্তি reason০,০০০ মান সহ প্রাক-জনবহুল একটি অ্যারে তৈরি করতে চান? যাইহোক, এটি সত্যই আমি দেখেছি এমন কিছু জঘন্য ওয়েবসাইটের বিবরণ দেয় যা কখনই লোডিং শেষ করে না বলে মনে হয় ...
জন হে

2
জন ও, আমি আমার সময়ে কয়েকটি স্ক্রি জেএসওন বাস্তবায়ন দেখেছি, এতে 2 ডি / 3 ডি অ্যারে যুক্ত রয়েছে, এতে আইএটিএ (বিমানবন্দর) কোড, বিমান সংস্থা-সংস্থাগুলি, ট্যুর-অপারেটরগুলি, রিসর্টগুলি, এবং অন্যান্য বৈশিষ্ট্য রয়েছে ... ... সমস্ত স্টাফ এক অ্যারে মধ্যে। এটি ... ... 1 এমবি + জেএসএন ডাউনলোডগুলি আমাকে কাঁদতে চায়।
নর্গার্ড


3

এটা new Array()অস্পষ্ট কারণ । এগুলি সঠিক নির্মাতা:

// Using brackets
[element0, element1, ..., elementN]

// Using new AND a list of elements
new Array(element0, element1, ..., elementN)

// Using new AND an integer specifying the array length
new Array(arrayLength)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.