ජාවාස්ක්‍රිප්ට් අරාව ප්‍රකාශ කරන අතරතුර “අරාව ()” සහ “[]” අතර වෙනස කුමක්ද?


847

මේ ආකාරයට අරාවක් ප්‍රකාශ කිරීම අතර සැබෑ වෙනස කුමක්ද:

var myArray = new Array();

සහ

var myArray = [];

[]සංකේත: ARRAY_INIT; new Arrayකාර්යභාරය අගයනු: NEW, IDENTIFIER; new Array()ටෝකන:NEW, IDENTIFIER, CALL
noobninja

Answers:


961

වෙනසක් ඇත, නමුත් එම උදාහරණයේ වෙනසක් නොමැත.

වඩාත් වාචික ක්‍රමය භාවිතා කිරීම: 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()ඔබට අරාවෙහි ප්‍රමාණය සැකසිය හැකි අතර එය තොගයේ ප්‍රමාණයට බලපායි. ඔබ තොග පිටාර ගැලීම් ලබා ගන්නේ නම් මෙය ප්‍රයෝජනවත් වේ ( Array.push vs Array.unshift හි කාර්ය සාධනය ) එය අරාවෙහි විශාලත්වය තොගයේ ප්‍රමාණය ඉක්මවා ගිය විට සිදු වන අතර එය නැවත නිර්මාණය කළ යුතුය. එබැවින් new Array()පිටාර ගැලීම වළක්වා ගත හැකි නිසා භාවිතා කිරීමේ අවස්ථාව අනුව කාර්ය සාධනය වැඩි විය හැකිය.

මෙම පිළිතුරෙහි පෙන්වා ඇති පරිදි , new Array(5)ඇත්ත වශයෙන්ම undefinedඅරාව වෙත අයිතම පහක් එකතු නොකරනු ඇත . එය හුදෙක් අයිතම පහක් සඳහා ඉඩක් එක් කරයි. Arrayමෙම ක්‍රමය භාවිතා array.lengthකිරීම ගණනය කිරීම් සඳහා විශ්වාසය තැබීම දුෂ්කර බව මතක තබා ගන්න .


67
මෙය තරමක් වැරදිය. නව අරාව () සහ [] අතර ඉතා වැදගත් වෙනසක් ඇත. මම මගේ පිළිතුර විස්තාරනය කරමි.
coderjoe

30
නමුත් ඔබේ පිළිතුරේ සඳහන් කර ඇති පරිදි, එය සම්පූර්ණයෙන්ම වෙනස් වන්නේ ඔබ සම්පූර්ණයෙන්ම උමතු වී අරා ශ්‍රිතය නැවත ලියන්නේ නම් පමණි ..?
nickf

19
වැදගත් වන්නේ නව ක්‍රියාකරු භාවිතා කිරීම නිසා පරිවර්තකයා ගෝලීය විෂය පථයට යෑමට සියලු ආකාරයේ අමතර පියවර ගැනීමටත්, ඉදිකිරීම්කරු සොයා ගැනීමටත්, ඉදිකිරීම්කරු අමතා ප්‍රති result ලය ලබා දීමටත් හේතු වේ ... බහුතරයකදී එය සිදුවනු ඇත aa ධාවන කාල අරාව. [] භාවිතා කිරීමෙන් ඔබට ගෝලීය ඉදිකිරීම්කරු සෙවීමේ පොදු කාර්යය මඟ හැරිය හැක. එය කුඩා බවක් පෙනෙන්නට තිබුණත්, ඔබ ඔබේ යෙදුමේ තත්‍ය කාලීන ක්‍රියාකාරිත්වය සඳහා වෙඩි තබන විට, එය වෙනසක් ඇති කළ හැකිය.
coderjoe

5
විශාල කාර්ය සාධන වෙනසක් ඇත: jsperf.com/create-an-array-of-initial-size/2
Marco Luglio

4
ඇත්ත, නමුත් මම ඒවා එකතු කරන බොහෝ ස්ථානවල ඔබට අර්ධ සළකුණු හෝ රේඛා බිඳීම් අවශ්‍ය නොවේ. එය අනුකූලතාව සහ පැහැදිලි බව ගැන ය. ඔබ දන්නවා, IMHO.
nickf

777

ව්‍යංග අරාව සහ අරාව සාදන්නා සමඟ අරාවක් නිර්මාණය කිරීම අතර වෙනස සියුම් නමුත් වැදගත් ය.

ඔබ භාවිතා කර අරාවක් සාදන විට

var a = [];

ඔබ පරිවර්තකයාට කියන්නේ නව ධාවන කාල අරාවක් නිර්මාණය කරන ලෙසයි. අමතර සැකසුම් අවශ්‍ය නොවේ. සිදු විය.

ඔබ භාවිතා කරන්නේ නම්:

var a = new Array();

ඔබ පරිවර්තකයාට කියනවා, මට අවශ්‍ය වන්නේ ඉදිකිරීම්කරුට “ Array” අමතා වස්තුවක් ජනනය කිරීමට ය. එවිට එය ඔබගේ ක්‍රියාත්මක කිරීමේ සන්දර්භය හරහා සොයා බැලීමට ඉදිකිරීම්කරු සොයා ගැනීමට හැකි වන අතර එය අමතන්නේ ඔබේ අරාව නිර්මාණය කරමිනි.

"හොඳයි, මෙය කිසිසේත්ම ප්‍රශ්නයක් නොවේ. ඒවා එක හා සමානයි!" අවාසනාවට ඔබට එය සහතික කළ නොහැක.

පහත උදාහරණය ගන්න:

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)

ඉහත උදාහරණයේ දී, පළමු ඇමතුම ඔබ බලාපොරොත්තු වන පරිදි 'ස්පාර්ටා' වෙත දැනුම් දෙනු ඇත. දෙවැන්න එසේ නොවේ. ඔබ නිර්වචනය නොකිරීම අවසන් වනු ඇත. B හි ස්වදේශික අරා වස්තු ශ්‍රිත සියල්ලම අඩංගු වන බව ඔබ සටහන් කරනු pushඇත.

මෙය සිදුවනු ඇතැයි ඔබ අපේක්ෂා කළද, එය නිරූපණය කරන්නේ []සමාන නොවන කාරණයකි new Array().

[]ඔබට අරාවක් අවශ්‍ය බව ඔබ දන්නේ නම් භාවිතා කිරීම වඩාත් සුදුසුය . වටේට ගොස් අරාව නැවත අර්ථ දැක්වීමට මම යෝජනා නොකරමි ...


161
හොඳයි, මම හිතනවා දැනගන්න එක හොඳයි. අරාව පන්තිය නැවත ලියන්නේ කුමන ආකාරයේ පුද්ගලයෙක්ද, මම නොදනිමි ...
nickf

162
ඔබ ඇත්තෙන්ම හරි. අරාව පන්තිය නැවත ලියන්නේ පිස්සෙකු පමණි. දැන් මොහොතක් ගත කර නව අරා () භාවිතා කරමින් අමතර වැඩ සියල්ල සලකා බලන්න. මම මේ සියල්ල සමඟ එක්ව [].
කෝඩර්ජෝ

51
ජාවාස්ක්‍රිප්ට් සමඟ කළ හැකි ගෝලීය දූෂණය පිළිබඳ හොඳ උදාහරණයක්.
ඩේවිඩ් ස්නබෙල්-කව්න්ට්

8
අංකනය භාවිතා කරමින් හැකි වෙනත් ක්‍රමවලට වඩා නව අරාව (ප්‍රමාණය) වේගවත් බව සඳහන් කිරීම වටී. මුලාශ්‍රය: jsperf.com/create-an-array-of-initial-size/2
මාකෝ

9
අවාසනාවට එම පරීක්ෂණය නුසුදුසු ලෙස සකස් කර ඇත. එය අරාවෙහි ආරම්භය සහ අරා ප්‍රවේශය සමඟ අරාව ආරම්භ කිරීම පරීක්ෂා කරයි. බ්‍රව්සර් ඇත්ත වශයෙන්ම මතකය කලින් වෙන් කර ඇති බව සනාථ කිරීමට පාලනයක් නොමැත (පිරිවිතරයන් ඔවුන් කළ යුතු යැයි නොකියයි). අරා ප්‍රවේශය නියත යැයි අපට උපකල්පනය කළ හැකි නම් සහ උදාහරණ දෙකෙහිම මතකය වෙන් කිරීම සඳහා වැඩි කාලයක් වැය කරනු ඇත. එවිට ඔබ මිලියන ගණනක් අරා ස්ථාපනය කරන්නේ නම් [] වඩාත් සුදුසු වේ. jsperf.com/array-instanciation
coderjoe

96

කිසිදු පිළිතුරක් තවම සඳහන් කර නැති වැදගත් වෙනසක් තිබේ.

මේකෙන්:

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

බලන්න? අර්ථ නිරූපණය සම්පූර්ණයෙන්ම වෙනස් ය! ඉතින් ඇයි ඒ?

ES6 පිරිවිතර 22.1.1.2 ට අනුව, කාර්යය Array(len)වන්නේ නව අරාවක් නිර්මාණය කිරීම පමණි, එහි දේපල lengthතර්කයට සකසා ඇති අතර lenඑය එයයි, එයින් අදහස් වන්නේ මෙම අලුතින් සාදන ලද අරාව තුළ සැබෑ අංගයක් නොමැති බවයි.

කාර්යය map(), 22.1.3.15 අයියා අනුව පලමුවෙන් පහත පරීක්ෂා කරන HasPropertyලද callback කතා නම්, නමුත් එම එය දුටුවේ:

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

සාදන ලද අරා වල සුපුරුදු පරිදි ක්‍රියා කරන කිසිදු ක්‍රියාකාරීත්වයක් අපේක්ෂා කළ නොහැක්කේ එබැවිනිnew Array(len) .

BTW, Safari සහ Firefox මෙම තත්වයට වඩා හොඳ "මුද්‍රණයක්" ඇත:

// 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]results ල දෘෂ්ටි කෝණයකට සමාන වේ .
රොබර්ටෝ ඇන්ඩ්‍රේඩ්

මගේ පෙර අදහස් වලට පිළිතුර “පැතිරුම් ක්‍රියාකරු” බව පෙනේ: javascript.info/rest-parameters-spread-operator
රොබෙටෝ ඇන්ඩ්‍රේඩ්

Ober රොබර්ටෝ ඇන්ඩ්‍රේඩ් අර්ථවත් වන්නේ පැතිරුම් ක්‍රියාකරුට එම පිටපත් කියවීමට අවශ්‍ය වන නිසා එවැනි පිටපත් කිරීමක් යෙදිය හැකි වන undefinedඅතර සුපුරුදු පරිදි හිස් තව් නැවත කියවීමයි .
හක්ස්

51

නියමාකාරයෙන්, ක්‍රෝම් new Array(size)වලට වඩා []2 ගුණයක් වේගවත් වන අතර එෆ්එෆ් සහ අයිඊ වල සමාන වේ (අරාව නිර්මාණය කිරීමෙන් හා පිරවීමෙන් මනිනු ලැබේ). එය වැදගත් වන්නේ අරාවෙහි ආසන්න ප්‍රමාණය ඔබ දන්නේ නම් පමණි. ඔබ ලබා දුන් දිගට වඩා වැඩි අයිතම එකතු කළහොත්, කාර්ය සාධනය ඉහළ යයි.

වඩාත් නිවැරදිව: Array(මතකය වෙන් නොකරන වේගවත් නියත කාල මෙහෙයුමක් වන අතර, වීරා []යනු වර්ගය සහ අගය නියම කරන රේඛීය කාල මෙහෙයුමකි.


3
මම එය බොහෝමයක් Node.js හි අත්හදා බැලුවෙමි: ඔබට යම් යම් අයිතමයන් අරාවෙහි තැබීමට අවශ්‍ය වූ විට, new Array(length)0 <= ප්‍රමාණය <= ~ 1000, ප්‍රමාණය මත> []
win


41

වැඩි විස්තර සඳහා, ඔබ කිසි විටෙකත් භාවිතා නොකිරීමට හේතුව පහත පිටුවෙහි විස්තර කෙරේnew Array()

ඔබ කිසි විටෙකත් new Object()JavaScript හි භාවිතා කිරීමට අවශ්‍ය නොවේ . {} ඒ වෙනුවට වචනාර්ථයෙන් වස්තුව භාවිතා කරන්න . ඒ හා සමානව, භාවිතා නොකරන්න new Array(), [] ඒ වෙනුවට අරාව වචනානුසාරයෙන් භාවිතා කරන්න. ජාවාස්ක්‍රිප්ට් හි අරා ජාවාහි අරා මෙන් කිසිවක් ක්‍රියා නොකරන අතර ජාවා වැනි සින්ටැක්ස් භාවිතය ඔබව ව්‍යාකූල කරනු ඇත.

භාවිතා නොකරන්න new Number, new Stringහෝ new Boolean. මෙම ආකෘති අනවශ්‍ය වස්තු ආවරණ නිපදවයි. ඒ වෙනුවට සරල වචනාර්ථ භාවිතා කරන්න.

අදහස්ද බලන්න - new Array(length)පෝරමය කිසිදු ප්‍රයෝජනවත් අරමුණක් ඉටු නොකරයි (අවම වශයෙන් අද ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමේදී).


3
ක්‍රෝක්ෆර්ඩ් ද පවසන්නේ නව අරා () වෙනුවට [] භාවිතා කරන ලෙසයි. අවාසනාවට, සම්බන්ධිත ලිපියේ හේතුව ඔහු නොකියයි. මම හිතන්නේ එය අවකාශය හා වේගය පිළිබඳ ප්‍රශ්නයක් පමණයි. javascript.crockford.com/code.html
නොස්රෙඩ්නා

4
ක්‍රොක්ෆර්ඩ් ජාවාස්ක්‍රිප්ට් හි වස්තුවක නව අවස්ථාවක් නිර්මාණය කිරීම සඳහා "නව" යතුරු පදය භාවිතා කිරීමේ රසිකයෙක් නොවේ. දේශනවලදී ඔහු කියා සිටියේ එය අවිනිශ්චිතතාවයක් ඇති කරන බවත් ජාවාස්ක්‍රිප්ට් හි මූලාකෘති ශෛලියේ උරුමය සමඟ නොගැලපෙන බවත් ඔහුගේ විශ්වාසයයි. ඔහු විශේෂයෙන් පරිශීලක විසින් සාදන ලද වස්තු සාදන්නන් ගැන සඳහන් කරයි, නමුත් එම විශ්වාසය අනුව, විකල්ප වාක්‍ය ඛණ්ඩයක් ඇති විට, එය ගොඩනංවන ලද ඒවා සමඟ භාවිතා නොකිරීමට ඔහු නිර්දේශ කරන්නේ මන්දැයි බැලීමට පහසුය.
ඇලන් කුණාටුව

Lan ඇලන් කුණාටුව: අවම වශයෙන් අංකය, නූල් සහ බූලියන් සඳහා ඔහු පවසන්නේ “මෙම ආකෘති අනවශ්‍ය වස්තු ආවරණ නිපදවන” බවයි, නමුත් එය අරාට අදාළ නොවනු ඇතැයි මම සිතමි.
BarelyFitz

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

ඉහත ප්‍රති result ලය වින්ඩෝස් 7 හි ගූගල් ක්‍රෝම් කොන්සෝලයෙනි.


4
නමුත් [] == [] හෝ [] === [] අසත්‍ය වන්නේ ඇයි?
anu

5
"වස්තු සංසන්දනය කරන ප්‍රකාශනයක් සත්‍ය වන්නේ ඔපෙරන්ඩ්ස් එකම වස්තුවක් සඳහන් කරන්නේ නම් පමණි." (මූලාශ්රය: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... )
srph

මෙම පිළිතුර චෙරි උදාහරණ තෝරාගන්නේ ඉදිකිරීම් දෙක එක සමාන බව ඇඟවීමට ය. මෙම පිටුවේ ඇති වෙනත් පෝස්ට් වල වෙනස්කම් පෙන්වා දෙයි, වැනි 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 array = නව අරාව (1, 2, 3);
nickf

එබැවින් මම සිතන්නේ ඔබට var array = [5]වර්ග වරහන් භාවිතා කළ හැකි නමුත් ඉදිකිරීම්කරු භාවිතා නොකර var array = Array(5)හිස් මූලද්‍රව්‍ය 5 ක් සෑදිය හැකිය .
cdmckay

cdmckay - එය වැරදියි. var a = [5] යනු තනි අයිතමයක් සහිත අරාවකි - අංක පහයි.
BarelyFitz

2
@ බෙරිලි ෆිට්ස්: ඒකයි මම කිව්වේ. බොග්ඩන්ස්ගේ පිළිතුරේ, ඔහු පවසන්නේ ඉදිකිරීම්කරුගේ ඇමතුම අරාව ආරම්භ කිරීමට භාවිතා කළ නොහැකි නමුත් ඔහු වැරදිය. මගේ අදහස හුදෙක් තනි මූලද්‍රව්‍යයක අරාවක් ආරම්භ කිරීම සඳහා ඔබට ඉදිකිරීම්කරු ඇමතුම භාවිතා කළ නොහැකි බව පැහැදිලි කිරීම පමණි.
cdmckay

1
@cdmckay: සමාවෙන්න, මම ඔබේ අදහස වරදවා වටහා ගත්තා. පැහැදිලි කිරීම සඳහා: නව අරාව (ආර්ග්) - ආර්ග් සංඛ්‍යාත්මක නම් මෙය දිග = ආර්ග් සමඟ හිස් අරාවක් නිර්මාණය කරයි; නව අරාව (arg1, arg2) - නව අරාවක් නිර්මාණය කර අරාව මූලද්‍රව්‍ය ආරම්භ කරයි. එබැවින් ඔබට [5] වැනි එක් සංඛ්‍යාත්මක මූලද්‍රව්‍යයක් සමඟ අරාවක් සෑදීමට අවශ්‍ය නම්, ඔබට නව අරාව (5) භාවිතා කර එය කළ නොහැක. නමුත් ඇත්ත වශයෙන්ම ඔබ කිසි විටෙකත් නව අරාව භාවිතා නොකළ යුතුය () එබැවින් මෙය වැදගත් කරුණකි.
BarelyFitz

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);

මම අරා වලට තවත් අගයක් එකතු කර ඇඟවීම් හතරක් කළෙමි: පළමු හා දෙවැන්න නම් එක් එක් අරාව තුළ ගබඩා කර ඇති අගය අපට ලබා දීමයි. ඔවුන් නැවත එනු ඇත! දැන් තුන්වැන්න උත්සාහ කරන්න, එය අසත්‍යයක් බවට පත්වේ, එයට හේතුව

JS අමතා, test1 ලෙස අරා දත්ත වර්ගය සමග විචල්ය , සහ එය සලකන test2 ලෙස මාලාවක් ක්රියාකාරිත්වය සහිත වස්තුවක්, , මෙහි සුළු වෙනස්කම් කිහිපයක් තිබේ.

පළමු වෙනස වන්නේ අප ටෙස්ට් 1 අමතන විට එය සිතීමකින් තොරව විචල්‍යයක් ලෙස හැඳින්වීමයි, එය එහි දත්ත වර්ගය නොසලකා මෙම විචල්‍යයේ ගබඩා කර ඇති අගයන් නැවත ලබා දෙයි! නමුත්, අපි ටෙස්ට් 2 අමතන විට එය අරේ () ශ්‍රිතය ලෙස හඳුන්වන අතර එය අපගේ “තල්ලු කළ” අගයන් එහි “අගය” දේපලෙහි ගබඩා කරයි, තවද අපි ටෙස්ට් 2 ට අනතුරු ඇඟවූ විට එය සිදු වේ, එය අරාව වස්තුවේ “අගය” දේපල නැවත ලබා දෙයි .

එබැවින්, ටෙස්ට් 1 ටෙස්ට් 2 ට සමාන දැයි පරීක්ෂා කර බැලීමේදී ඒවා කිසි විටෙකත් සත්‍ය නොවනු ඇත, එකක් ශ්‍රිතයක් වන අතර අනෙක විචල්‍ය වේ (අරාව වර්ගයක් සහිත), ඒවාට සමාන අගයක් තිබුණත්!

ඒ ගැන සහතික වීමට, .value එයට එකතු කර 4 වන ඇඟවීම උත්සාහ කරන්න; එය සැබෑ වනු ඇත. මෙම අවස්ථාවේදී අපි JS ට කියමු "බහාලුම් වර්ගය නොසලකා එය ක්‍රියාකාරී හෝ විචල්‍ය වුවත්, කරුණාකර එක් එක් බහාලුම්වල ගබඩා කර ඇති අගයන් සංසන්දනය කර ඔබ දුටු දේ අපට කියන්න!" එය හරියටම සිදුවන්නේ එයයි.

මම හිතන්නේ මම ඒ පිටුපස ඇති අදහස පැහැදිලිව පැවසුවා, මගේ නරක ඉංග්‍රීසි ගැන කණගාටුයි.


19
එවැනි සම්පූර්ණ හා මුලුමනින්ම විකාරයක් ඡන්දය ප්‍රකාශ කිරීම පුදුම සහගතය. අරා අතර සංසන්දනය ඔබ ඒවා සාදන ආකාරය කුමක් වුවත් එය ව්‍යාජ වනු ඇත, මන්ද එය වස්තු අනන්‍යතාවය සංසන්දනය කරන අතර ඒවා වෙනස් වස්තු වේ. අරා වල වටිනා දේපලක් නොමැත. []සහ new Array()සමාන වේ; අවස්ථා දෙකේදීම .valueවනු ඇති undefinedඅතර ඒවා සංසන්දනය කිරීම සැමවිටම අසත්‍ය වේ.
slkts

එකඟ විය, මෙම පිළිතුර තේරුමක් නැති අතර කිසිවක් නොපෙන්වයි. එවැනි දෙයක් නැත array.value. දෙකම typeof []සහ typeof new Array()ආපසු object. ශ්‍රිතයක් Array.isArray
ඇතිවීමට

හොඳයි යාලුවනේ, මම ඔබ සමඟ එකඟයි :) මම ඒ අවස්ථාවේ සම්පූර්ණ විකාරයක් ලිව්වා :). දැන් මම එකම ප්‍රශ්නයට නිවැරදි පිළිතුර එකතු කර ඇත්තෙමි. ඔබ දකින දේ මට දන්වන්න. මම ඔබේ අදහස් අගය කරමි.
කොලියෝ

4

ඔබ දිගකින් තොරව අරාව ආරම්භ කරන විට වෙනසක් නැත. ඉතින් var a = []& var b = new Array()සමානයි.

නමුත් ඔබ අරාව වැනි දිගකින් අරාව ආරම්භ කරන්නේ නම් var b = new Array(1);, එය අරාව වස්තුවේ දිග 1 ට සකසනු ඇත var b = []; b.length=1;. එබැවින් එය සමාන වේ .

ඔබ array_object.push කරන සෑම විටම මෙය ගැටළු සහගත වනු ඇත, එය අවසාන අංගයට පසුව අයිතමය එකතු කර දිග වැඩි කරයි.

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

පළමුවැන්න පෙරනිමි වස්තු ඉදිකිරීම්කරු ඇමතුමයි. ගතික අගයන් සඳහා බොහෝ දුරට භාවිතා වේ.

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

ස්ථිතික අගයන් නිර්මාණය කිරීමේදී දෙවන අරාව භාවිතා වේ

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

3

විශාල වෙනසක් නැත, ඔවුන් මූලික වශයෙන් එකම දේ කරන නමුත් ඒවා විවිධ ආකාරවලින් සිදු කරයි, නමුත් කියවන්න, W3C හි මෙම ප්‍රකාශය දෙස බලන්න:

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

මෙම නව මූල පදය පමණක් කේතය පිලිබද. එය අනපේක්ෂිත ප්‍රති results ල ලබා දිය හැකිය:

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දෙවැන්නයි.

නමුත් අවධානය යොමු කරන්න, මේ දේවල් යාවත්කාලීන කිරීම් සමඟ බොහෝ වෙනස් වීමට නැඹුරු වේ. ධාවන කාලය විවිධ බ්‍රව්සර් අතර වෙනස් වේ.

උදාහරණයක් ලෙස - මා සඳහන් කළ 2 වන විකල්පය, මිලියන 2 ක් (තත්පරයට / තත්පරයට) ධාවනය වේ chrome, නමුත් ඔබ එය උත්සාහ කළහොත් ඔබට mozilla dev.පුදුම හිතෙන තරම් ඉහළ අනුපාතයක් මිලියන 23 ක් ලැබෙනු ඇත.

කොහොම උනත්, මම ඔබ එය පරීක්ෂා කර බලන්න, වෙනස් බ්රව්සර (සහ යන්ත්ර) මත, වෙබ් අඩවිය භාවිතා කරන යෝජනා කියලා ටික සෑම වරක් වැනි


2

මම diference දන්නා පරිදි ඔබ වැනි පෙත්තක් (හෝ Array අනෙක් funcitons) සොයා ගත හැකි code1 .ඒ code2 ඔබ පෙන්වන Array සහ ඔහුගේ අවස්ථා :

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()Array.And නව උදාහරණයක් නිර්මාණය ඔවුන් සියලු පතිරූපක කාර්යයන් ලබාArray.prototype

ඒවා අරේගේ වෙනස් උදාහරණයකි [] != []

:)


2

[] භාවිතා කරමින් මම අමුතු හැසිරීමකට මුහුණ දී සිටිමි.

අපට කිසියම් අගයකට ආරම්භක ක්ෂේත්‍ර සහිත ආදර්ශ "පන්ති" ඇත. උදා:

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

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

ක්ෂේත්‍ර ආරම්භ කළ []විට එය සියලු ආදර්ශ වස්තු විසින් බෙදා ගනු ඇති බව මට පෙනී ගියේය . එක් අයෙකුට වෙනස්කම් කිරීම අනෙක් සියල්ලන්ටම බලපායි.

මෙය ආරම්භ කිරීමෙන් මෙය සිදු නොවේ new Array(). වස්තූන් ආරම්භ කිරීම සඳහා සමාන වේ ( {}එදිරිව නව Object())

TBH අප භාවිතා කළ රාමුව ( ඩොජෝ ) සමඟ එය ගැටළුවක් දැයි මට විශ්වාස නැත


2

ඇසට පෙනෙන දේට වඩා මේ සඳහා තවත් බොහෝ දේ ඇත. අනෙක් බොහෝ පිළිතුරු නිවැරදි නමුත් වෙනත් ..

new Array(n)

  • nමූලද්‍රව්‍ය සඳහා අවකාශය නැවත වෙන් කිරීමට එන්ජිමට ඉඩ දෙන්න
  • අරාව නිර්මාණය සඳහා ප්‍රශස්ත කර ඇත
  • සාදන ලද අරාව අවම ක්‍රියාකාරී අරා මෙහෙයුම් ඇති විරල ලෙස සලකුණු කර ඇත, එයට හේතුව එක් එක් දර්ශක ප්‍රවේශයට සීමාවන් පරික්ෂා කිරීම, අගය තිබේදැයි බැලීමට සහ මූලාකෘති දාමය ගමන් කිරීම ය.
  • අරාව විරල ලෙස සලකුණු කර ඇත්නම්, ආපසු යා හැකි මාර්ගයක් නොමැත (අවම වශයෙන් V8 හි), එය එහි ජීවිත කාලය තුළ සෑම විටම මන්දගාමී වනු ඇත, ඔබ එය අන්තර්ගතයෙන් (ඇසුරුම් කළ අරාව) 1ms හෝ පැය 2 කට පසුව පුරවා ගත්තද, කමක් නැත

[1, 2, 3] || []

  • සාදන ලද අරාව ඇසුරුම් කර ඇති බව සලකුණු කර ඇත (ඔබ භාවිතා කරන්නේ deleteහෝ [1,,3]වාක්‍ය ඛණ්ඩය හැර)
  • අරාව සඳහා නිපැදවුන මෙහෙයුම් ( for .., forEach, map, ආදී)
  • අරාව වර්ධනය වන විට එන්ජිමට අවකාශය නැවත වෙන් කිරීම අවශ්‍ය වේ

මෙම බොහෝ විට පැරණි බ්රවුසරයක් සංස්කරණ / බ්රවුසර සඳහා එසේ නොවේ.


1

හොඳයි, සමහර විශේෂාංග var x = new Array()වලට වඩා var x = []වෙනස් වේ මම ඒවායින් වඩාත්ම ප්‍රයෝජනවත් දෙක (මගේ මතය අනුව) පැහැදිලි කරන්නම්.

වෙනස්කම් පැහැදිලි කිරීමට පෙර, මම පළමුව පදනමක් තබමි; අප භාවිතා කරන විට x = []දත්ත වර්ගයේ අරාව සමඟ නව විචල්‍යයක් නිර්වචනය කරන අතර, එය අරාව මූලාකෘතියට අයත් සියලු ක්‍රම උරුම කර ගනී, එය පන්තියක් දීර් ing කිරීමට සමාන (නමුත් හරියටම නොවේ). කෙසේ වෙතත්, අප x = new Array()එය භාවිතා කරන විට විචල්‍යයට පවරා ඇති අරාව මූලාකෘතියේ ක්ලෝනයක් ආරම්භ කරයි x.

දැන් අපි බලමු වෙනස මොකක්ද කියලා

පළමු වෙනස නම් පූර්ණ සංඛ්‍යාවක් ඇති new Array(x)තැන භාවිතා xකිරීම, xනිර්වචනය නොකළ අගයන් new Array(16)රාශියක් ආරම්භ කිරීමයි , නිදසුනක් ලෙස අයිතම 16 ක් සහිත අරාවක් ආරම්භ කරනු ඇත. ඔබ පූර්ව නිශ්චිත දිගකින් පෙළක් අසමමුහුර්තව පුරවන විට මෙය ඉතා ප්‍රයෝජනවත් වේ. උදාහරණයක් ලෙස (නැවතත් :)) අපි ඔබට තරඟකරුවන් 100 දෙනෙකුගේ ප්‍රති results ල ලබා ගනිමු යැයි කියමු, ඔබ ඒවා දුරස්ථ පද්ධතියකින් හෝ ඩීබී එකකින් අසමසම ලෙස ලබා ගනී, එවිට ඔබට ලැබුණු පසු ඒවා ශ්‍රේණිගත කිරීම අනුව පෙළට වෙන් කළ යුතුය. එක් එක් ප්රති result ලය. මෙම ඉතා දුර්ලභ අවස්ථාවෙහිදී ඔබ එවැනි දෙයක් කරනු ඇත myArray[result.rank - 1] = result.name, එබැවින් 1 ශ්‍රේණිය දර්ශකය 0 වෙත සකසනු ඇත.

දෙවන වෙනස නම්, new Array()ඔබ දැනටමත් දන්නා පරිදි භාවිතා කිරීම, අරාව මූලාකෘතියේ නව ක්ලෝනයක් ක්ෂණිකව ස්ථාපනය කර එය ඔබේ විචල්‍යයට පවරන අතර එමඟින් ඔබට මැජික් කිහිපයක් කිරීමට ඉඩ ලබා දේ (නිර්දේශිත btw). මෙම මැජික් යනු ඔබට උරුම අරා ක්‍රමවල නිශ්චිත ක්‍රමයක් නැවත ලිවිය හැකිය. ඉතින්, උදාහරණයක් ලෙස ඔබට Array.pushනව අගය අවසානය වෙනුවට අරාවේ ආරම්භයට තල්ලු කිරීමේ ක්‍රමය සැකසිය හැකි අතර, අරේ මූලාකෘතියේ මෙම විශේෂිත ක්ලෝනයට නව ක්‍රම (මෙය වඩා හොඳ) එකතු කළ හැකිය. එමඟින් ඔබේ ව්‍යාපෘතිය පුරා වඩාත් සංකීර්ණ ආකාරයේ අරා වර්ග ඔබේම එකතු කළ ක්‍රම මගින් නිර්වචනය කර එය පන්තියක් ලෙස භාවිතා කිරීමට ඉඩ ලබා දේ.

අවසාන දෙය නම්, ඔබ ඔබේ යෙදුමේ පොදු කාර්ය සහ මතක පරිභෝජනය සැකසීමට සැලකිලිමත් වන ඉතා සුළු පිරිසකගෙන් (මම සැබවින්ම ආදරය කරන) නම්, new Array()එය භාවිතා කිරීමට මංමුලා සහගත නොවී ඔබ කිසි විටෙකත් දැඩි නොවනු ඇත :).

මෘගයා ගැන එය ප්‍රමාණවත් ලෙස පැහැදිලි කර ඇතැයි මම බලාපොරොත්තු වෙමි new Array():)


-3

මට සෑහෙන්න අමාරු වූ ඉදිකිරීම් දෙක අතර එක් වෙනසක් මට හමු විය.

මා සතුව ඇතැයි කියමු:

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()යුතුය.


මෙම JSFiddle පෙන්වන්නේ ප්‍රතිදානය යනු අරාව වචනානුසාරයෙන් []සහ new Array()ඉදිකිරීම්කරු සමඟ ඔබ අපේක්ෂා කරන දෙයයි. එහි ප්‍රති property ලයක් ලෙස එක් දේපලකට එක් අරාවකට එක් අයිතමයක් ලැබේ. ඔබ ඉහත පෙන්වන ප්‍රති result ලය සමඟ අවසන් වීමට ඔබේ කේතයේ වෙනත් දෙයක් තිබිය යුතුය.
gfullam

බකී, එය මට කිසිදු බ්‍රව්සරයක සිදු නොවේ. එම හැසිරීම ලබා ගැනීම සඳහා ඔබට මෙවැනි දෙයක් කළ යුතුය: var property1static=[]; function MyClass(){ this.property1=property1static; this.property2=new Array(); };
ඩේව් බර්ටන්

-3

අරේ ඉදිකිරීම්කරු භාවිතා කිරීමෙන් අපේක්ෂිත දිගෙහි නව පෙළක් සාදනු ලබන අතර එක් එක් දර්ශක නිර්වචනය නොකෙරේ.


1
නැත, අරාව ජනාකීර්ණ නොවේ, ඇතුළත දර්ශක / යතුරු නොමැත. උදාහරණයක් ලෙස .forEach වැඩ කරන්නේ නැත.
CFrei
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.