জাভাস্ক্রিপ্ট অ্যারে কি বিরল?


99

এটি হ'ল, যদি আমি বর্তমান সময়টিকে অ্যারেতে সূচি হিসাবে ব্যবহার করি:

array[Date.getTime()] = value;

দোভাষা 0 থেকে এখন পর্যন্ত সমস্ত উপাদান ইনস্ট্যান্ট করবে? বিভিন্ন ব্রাউজারগুলি কি এটি আলাদাভাবে করে?

আমার মনে আছে এআইএক্স কার্নেলে একটি বাগ থাকত, যা অনুরোধের ভিত্তিতে সিউডো-টিটি তৈরি করবে, তবে আপনি যদি বলেন, "প্রতিধ্বনি> / dev / pty10000000000" এটি তৈরি করবে / dev / pty0, / dev / pty1, .... এবং তারপরে মৃতের উপর পড়ে। ট্রেড শোতে এটি মজাদার ছিল, তবে আমি চাই না যে এটি আমার গ্রাহকদের সাথে ঘটুক।


4
এটি করার একটি সম্ভাব্য খারাপ দিক হ'ল ফায়ারব্যাগে ডিবাগিংয়ের অসুবিধা। অ্যারেতে একটি লগ স্টেটমেন্ট কেবল অ্যারের মধ্যে প্রথম 1000 উপাদানগুলির তালিকা তৈরি করবে, যা সমস্ত "অপরিজ্ঞাত" হবে। এছাড়াও, অ্যারে. দৈর্ঘ্য আপনাকে জানিয়ে দেবে যে আপনার অ্যারেতে এতে এন উপাদান রয়েছে, যদিও এন -1 কেবল "ভূত" অপরিবর্তিত মান values
মাইকেল বাটলার

ডিবাগিং এখন ক্রোমে ঠিক আছে - এখানে কনসোল আউটপুটের একটি উদাহরণ রয়েছে: [খালি × 9564, অবজেক্ট, খালি × 105, অবজেক্ট, খালি × 10, অবজেক্ট, খালি × 12, অবজেক্ট, খালি × 9, অবজেক্ট, খালি × 21, অবজেক্ট, খালি × 9, অবজেক্ট]
জালভাটা

উত্তর:


40

জাভাস্ক্রিপ্ট অ্যারেগুলি ঠিক কীভাবে প্রয়োগ করা হয় তা ব্রাউজার থেকে আলাদা হয়ে যায় তবে তারা সাধারণত একটি বিরল বাস্তবায়নে ফিরে যায় - সম্ভবত নিয়মিত জিনিসগুলির সম্পত্তি অ্যাক্সেসের জন্য একই ব্যবহার করা হয় - যদি প্রকৃত অ্যারে ব্যবহার করা অযোগ্য হয়।

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

অলিজে আরও বিশদ বিবরণের জন্য এই উত্তরটি দেখুন ।


4
আমি মনে করি না আপনি যদি এমন কিছু বলেন তবে আপনি আসলে একটি ঘন অ্যারে পেয়েছেন foo = new Array(10000)। যাইহোক, এই কাজ করার কথা হয়: foo = Array.apply(null, {length: 10});
ডাবলআর্ট

71

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

<script>
  var array = [];
  array[0] = "zero";
  array[new Date().getTime()] = "now";
  array[3.14] = "pi";

  for (var i in array) {
      alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
  }
</script>

প্রদর্শন:

array[0] = zero, typeof(0) == string
array[1254503972355] = now, typeof(1254503972355) == string
array[3.14] = pi, typeof(3.14) == string

আমি কীভাবে for...inসিনট্যাক্স ব্যবহার করেছি তা লক্ষ্য করুন , যা কেবলমাত্র আপনাকে সূচকগুলি দেয় যা প্রকৃতভাবে সংজ্ঞায়িত হয় are যদি আপনি for (var i = 0; i < array.length; ++i)পুনরাবৃত্তির আরও সাধারণ শৈলী ব্যবহার করেন তবে স্পষ্টতই আপনার অ-মানক অ্যারে সূচকগুলির সাথে সমস্যা হবে।


9
বেশিরভাগ জেএস বাস্তবায়ন সম্ভব হলে প্রকৃত অ্যারেতে সংখ্যাসূচকভাবে সূচকযুক্ত বৈশিষ্ট্যগুলি সংরক্ষণ করে; এটি দৃশ্যপটের যাদুগুলির পিছনে, যদিও: একটি ভাষার দৃষ্টিকোণ থেকে, অ্যারেগুলি হ'ল একটি যাদু lengthসম্পত্তি সহ নিয়মিত জিনিস
ক্রিস্টোফ

7
@ জন: লুপগুলিতে lengthকেবল অদৃশ্য for..inকারণ এটিতে DontEnumপতাকা সেট রয়েছে; ES5- এ, সম্পত্তি বৈশিষ্ট্যটি কল করা হয় enumerableএবং এর মাধ্যমে স্পষ্টভাবে সেট করা যায়Object.defineProperty()
ক্রিস্টোফ

14
জাভাস্ক্রিপ্টের সমস্ত অবজেক্ট কী সর্বদা থাকে String; সাবস্ক্রিপ্টে আপনি যে কোনও কিছু রেখেছেন তা-ও হয়ে যায় toString()। বিপুল সংখ্যক পূর্ণসংখ্যা অনির্দিষ্টতা সঙ্গে এই একত্রিত করুন এবং এটা মানে যদি আপনার সেট করা a[9999999999999999]=1, a[10000000000000000]1 হতে হবে (এবং আরো অনেক বিস্ময়কর আচরণে)। চাবি হিসাবে অ-পূর্ণসংখ্যার ব্যবহার করা খুব বোকামি, এবং স্বেচ্ছাসেবী অবজেক্টগুলি ঠিক বাইরে।
বোবিনস

73
তারপরে আপনি কেবল স্ট্রিংসকে অবজেক্ট কী হিসাবে ব্যবহার করবেন, আর কিছু হবে না, কমও থাকবে না। স্ট্রিংটি আপনি যে ধরণের ব্যবহার করবেন তা হবে, এবং কীটির ধরণ হবে স্ট্রিং। আপনি পূর্বে স্ট্রিংয়ের দিকে অগ্রসর হন ex স্বেচ্ছাসেবী অবজেক্টগুলি ঠিক আছে।
ক্রিসেন্ট টাটকা

8
অ্যারে সূচকগুলি অবশ্যই পূর্ণসংখ্যা হতে হবে। অ্যারে [3.14] = পাই কাজ করে কারণ অ্যারে অবজেক্ট থেকে অন্তর্নিহিত হয়। উদাহরণ: var x = []; x [.1] = 5; তারপরে x এর দৈর্ঘ্য 0 টি এখনও আছে।
মাইক Blandford 20

10

আপনি এই ধরণের জিনিসটির জন্য ডিজাইন করা জাভাস্ক্রিপ্ট সিনট্যাক্স ব্যবহার করে সমস্যাটি এড়াতে পারেন। আপনি এটিকে অভিধান হিসাবে বিবেচনা করতে পারেন, তবুও "for ... in ..." সিনট্যাক্স আপনাকে সেগুলি ধরতে দেবে।

var sparse = {}; // not []
sparse["whatever"] = "something";

7

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


4
এটি একটি ভাষার দৃষ্টিকোণ থেকে; বাস্তবায়নগুলি ঘন সংখ্যাগুলির বৈশিষ্ট্যগুলি সংরক্ষণ করতে প্রকৃত অ্যারেগুলি ব্যবহার করে
ক্রিস্টোফ

6

উত্তরটি সাধারণত জাভাস্ক্রিপ্টের মতো সত্য, এটি "এটি কিছুটা আরও খারাপতর ...."

মেমোরির ব্যবহার সংজ্ঞায়িত করা হয়নি এবং কোনও প্রয়োগকে বোকা হওয়ার অনুমতি দেওয়া হয়। তত্ত্ব অনুসারে, const a = []; a[1000000]=0;মেগাবাইট মেমরির জ্বলতে পারে, যেমন পারে const a = [];। বাস্তবে, এমনকি মাইক্রোসফ্টও এই প্রয়োগগুলি এড়িয়ে চলে।

জাস্টিন লাভ দেখিয়েছেন, দৈর্ঘ্যের বৈশিষ্ট্যটি সর্বোচ্চ সূচক সেট। তবে সূচকটি পূর্ণসংখ্যা হলে এটি কেবল আপডেট হয়।

সুতরাং, অ্যারে বিরল। কমানো (), ম্যাথ.ম্যাক্স () এবং "এর জন্য ..." এর মতো অন্তর্নির্মিত ফাংশনগুলি সম্ভাব্য পূর্ণসংখ্যার সূচকগুলির পুরো পরিসীমাটি দৈর্ঘ্যে 0 অবধি বিস্তৃত হবে, এমন অনেকগুলি পরিদর্শন করবে যা 'অপরিজ্ঞাত' ফিরে আসে। তবে 'এর জন্য ...' এর জন্য লুপগুলি আপনার প্রত্যাশা অনুযায়ীই করতে পারে, কেবলমাত্র সংজ্ঞায়িত কীগুলিতে যান।

নোড.জেএস ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে:

"use strict";
const print = console.log;

let a = [0, 10];
// a[2] and a[3] skipped
a[4] = 40;
a[5] = undefined;  // which counts towards setting the length
a[31.4] = 'ten pi';  // doesn't count towards setting the length
a['pi'] = 3.14;
print(`a.length= :${a.length}:, a = :${a}:`);
print(`Math.max(...a) = :${Math.max(a)}: because of 'undefined values'`);
for (let v of a) print(`v of a; v=:${v}:`);
for (let i in a) print(`i in a; i=:${i}: a[i]=${a[i]}`);

প্রদান:

a.length= :6:, a = :0,10,,,40,:
Math.max(...a) = :NaN: because of 'undefined values'
v of a; v=:0:
v of a; v=:10:
v of a; v=:undefined:
v of a; v=:undefined:
v of a; v=:40:
v of a; v=:undefined:
i in a; i=:0: a[i]=0
i in a; i=:1: a[i]=10
i in a; i=:4: a[i]=40
i in a; i=:5: a[i]=undefined
i in a; i=:31.4: a[i]=ten pi
i in a; i=:pi: a[i]=3.14

কিন্তু। অ্যারেতে আরও উল্লেখ করা হয়নি যা এখনও উল্লেখ করা হয়নি।


2

স্বল্পতা (বা ঘনত্ব) অ-মানক প্রক্রিয়া.মেমরি ইউজেজ () এর সাহায্যে নোডজেএসের জন্য পরীক্ষামূলকভাবে নিশ্চিত করা যায় ।

কখনও কখনও নোড অ্যারে স্পার্স রাখার জন্য যথেষ্ট চালাক হয়:

Welcome to Node.js v12.15.0.
Type ".help" for more information.
> console.log(`The script is using approximately ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024 * 100) / 100} MB`)
The script is using approximately 3.07 MB
undefined
> array = []
[]
> array[2**24] = 2**24
16777216
> array
[ <16777216 empty items>, 16777216 ]
> console.log(`The script is using approximately ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024 * 100) / 100} MB`)
The script is using approximately 2.8 MB
undefined

কখনও কখনও নোড এটি ঘন করতে বেছে নেয় (ভবিষ্যতে এই আচরণটি ভালভাবে অনুকূলিত হতে পারে):

> otherArray = Array(2**24)
[ <16777216 empty items> ]
> console.log(`The script is using approximately ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024 * 100) / 100} MB`)
The script is using approximately 130.57 MB
undefined

তারপরে আবার কমল করুন:

> yetAnotherArray = Array(2**32-1)
[ <4294967295 empty items> ]
> console.log(`The script is using approximately ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024 * 100) / 100} MB`)
The script is using approximately 130.68 MB
undefined

সুতরাং সম্ভবত আসল এআইএক্স কার্নেল বাগের অনুভূতি পেতে একটি ঘন অ্যারে ব্যবহার করার জন্য একটি রেঞ্জ-সমানভাবে বাধ্য করা প্রয়োজন :

> denseArray = [...Array(2**24).keys()]
[
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
  24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
  36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
  72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
  84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  96, 97, 98, 99,
  ... 16777116 more items
]
> console.log(`The script is using approximately ${Math.round(process.memoryUsage().heapUsed / 1024 / 1024 * 100) / 100} MB`);
The script is using approximately 819.94 MB
undefined

কেন এটি পড়ে না?

> tooDenseArray = [...Array(2**32-1).keys()]

<--- Last few GCs --->

[60109:0x1028ca000]   171407 ms: Scavenge 1072.7 (1090.0) -> 1056.7 (1090.0) MB, 0.2 / 0.0 ms  (average mu = 0.968, current mu = 0.832) allocation failure 
[60109:0x1028ca000]   171420 ms: Scavenge 1072.7 (1090.0) -> 1056.7 (1090.0) MB, 0.2 / 0.0 ms  (average mu = 0.968, current mu = 0.832) allocation failure 
[60109:0x1028ca000]   171434 ms: Scavenge 1072.7 (1090.0) -> 1056.7 (1090.0) MB, 0.2 / 0.0 ms  (average mu = 0.968, current mu = 0.832) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x100931399]
    1: StubFrame [pc: 0x1008ee227]
    2: StubFrame [pc: 0x100996051]
Security context: 0x1043830808a1 <JSObject>
    3: /* anonymous */ [0x1043830b6919] [repl:1] [bytecode=0x1043830b6841 offset=28](this=0x104306fc2261 <JSGlobal Object>)
    4: InternalFrame [pc: 0x1008aefdd]
    5: EntryFrame [pc: 0x1008aedb8]
    6: builtin exit frame: runInThisContext(this=0x104387b8cac1 <ContextifyScript map = 0x1043...

FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory

Writing Node.js report to file: report.20200220.220620.60109.0.001.json
Node.js report completed
 1: 0x10007f4b9 node::Abort() [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 2: 0x10007f63d node::OnFatalError(char const*, char const*) [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 3: 0x100176a27 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 4: 0x1001769c3 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 5: 0x1002fab75 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 6: 0x1005f3e9b v8::internal::Runtime_FatalProcessOutOfMemoryInvalidArrayLength(int, unsigned long*, v8::internal::Isolate*) [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 7: 0x100931399 Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
 8: 0x1008ee227 Builtins_IterableToList [/Users/pzrq/.nvm/versions/node/v12.15.0/bin/node]
Abort trap: 6

4
ভাল লাগল, এবং আমি দশ বছরের পুরানো প্রশ্নটি এখনও প্রাসঙ্গিকভাবে অবাক!
বেরি

1

তারা হতে পারে তবে তাদের সর্বদা থাকতে হবে না এবং তারা যখন না থাকে তখন তারা আরও ভাল পারফর্ম করতে পারে।

এখানে অ্যারে উদাহরণস্বরূপ সূচক স্বল্পতার জন্য কীভাবে পরীক্ষা করতে হয় সে সম্পর্কে এখানে আলোচনা করা হয়েছে: https://benmccormick.org/2018/06/19/code-golf-sparse-arrays/

এই কোড গল্ফ (সর্বাধিক অক্ষর) বিজয়ী হয়:

let isSparse = a => !!a.reduce(x=>x-1,a.length)

মূলত দৈর্ঘ্যের মান হ্রাস করার সময় এবং !!মিথ্যা / সত্যবাদী সংখ্যাসূচক ফলাফলের শক্ত বুলিয়ান ফিরিয়ে আনার ক্ষেত্রে সূচীকৃত এন্ট্রিগুলির জন্য অ্যারে হাঁটা (যদি সংযোজকটি শূন্যে সমস্তভাবে হ্রাস করা হয় তবে সূচকটি সম্পূর্ণরূপে বিশিষ্ট হয় এবং বিচ্ছিন্ন নয়)। উপরের চার্লস মেরিয়ামের গুহাগুলিও সেই হিসাবে বিবেচনা করা উচিত এবং এই কোডটি তাদের সম্বোধন করে না, তবে তারা হ্যাশ স্ট্রিং এন্ট্রিগুলিতে প্রয়োগ করে যা ঘটনাক্রমে যখন উপাদান arr[var]= (something)পূর্ণসংখ্যক ছিল না এমন উপাদানগুলি নির্ধারণের সময় ঘটতে পারে ।

সূচকের স্বল্পতার বিষয়ে যত্ন নেওয়ার কারণ হল এর কার্য সম্পাদনের প্রভাব, যা স্ক্রিপ্ট ইঞ্জিনগুলির মধ্যে পৃথক হতে পারে, অ্যারে তৈরি / .Iitialization সম্পর্কে এখানে দুর্দান্ত আলোচনা আছে: একটি জাভাস্ক্রিপ্ট ঘোষণার সময় "অ্যারে ()" এবং "[]" এর মধ্যে পার্থক্য কী? অ্যারে?

সাম্প্রতিক পোস্টটির উত্তরটির মধ্যে এই গভীর ডুব দেওয়ার একটি লিঙ্ক রয়েছে যে কীভাবে ভি 8 স্বল্পতার মতো বৈশিষ্ট্যগুলির জন্য পরীক্ষার (পুনরায়) পরীক্ষা এড়াতে টেস্ট করে অ্যারেগুলিকে অনুকূল করতে চেষ্টা করে: https://v8.dev/blog/eferences- જાজাতীয় । ব্লগ পোস্টটি সেপ্টেম্বর 17 এর থেকে এবং উপাদানটি কিছুটা পরিবর্তন সাপেক্ষে, তবে প্রতিদিনের বিকাশের জন্য অন্তর্ভুক্তিতে ভাঙ্গা দরকারী এবং স্পষ্ট।

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