අරාව පුනරාවර්තනය සඳහා “for… in” භාවිතා කිරීම නරක අදහසක් වන්නේ ඇයි?


1830

for...inජාවාස්ක්‍රිප්ට් හි අරා සමඟ භාවිතා නොකරන ලෙස මට පවසා ඇත . ඇයි නැත්තේ?


45
කවුරුහරි ඔබට එය පැවසූ මෑත ප්‍රශ්නය මම දුටුවෙමි, නමුත් ඒවා අදහස් කළේ අරා සඳහා පමණි. එය අරා හරහා නැවත යෙදීම නරක පුරුද්දක් ලෙස සලකනු ලබන නමුත් අවශ්‍යයෙන්ම වස්තුවක සාමාජිකයන් හරහා නැවත යෙදීම සඳහා නොවේ.
mmurch

19
'සඳහා (var i = 0; i <hColl.length; i ++) {}' වැනි 'for' ලූප සමඟ පිළිතුරු ගොඩක් var 'var i = hColl.length හා සසඳන්න; අතර (i--) {} ', එය පසුකාලීන ස්වරූපය භාවිතා කළ හැකි විට එය සැලකිය යුතු වේගයකින් යුක්ත වේ. මෙය ස්පර්ශක බව මම දනිමි, නමුත් මම සිතුවේ මෙය ටිකක් එකතු කර ගත හැකි බවයි.
මාර්ක් ෂුල්ටිස්

2
Ark මාක්ස්චුල්ටයිස් නමුත් එය ප්‍රතිලෝම ක්‍රියාවලියකි. ඉදිරි පුනරාවර්තනයේ තවත් සංස්කරණයක් වේගවත්ද?
ma11hew28

5
Yn වයිනන්ඩ් var i = hCol1.length; for (i;i;i--;) {}හැඹිලිය i භාවිතා කිරීමෙන් වෙනසක් ඇති වන අතර පරීක්ෂණය සරල කරන්න. - පැරණි බ්‍රව්සරය, අතර ඇති වෙනස forසහ whileසෑම විටම "i" කවුන්ටරය හැඹිලිගත කරයි - ඇත්ත වශයෙන්ම negative ණ සෑම විටම තත්වයට නොගැලපෙන අතර obfuscate සමහර අය සඳහා කේතය ටිකක් අතර negative ණ වේ. සටහන් var i = 1000; for (i; i; i--) {}කර ගන්න var b =1000 for (b; b--;) {}, මම 1000 සිට 1 දක්වාත්, b 999 සිට 0 දක්වාත් යන තැන - බ්‍රව්සරය පැරණි වන තරමට, කාර්ය සාධනය සඳහා වැඩි කැමැත්තක් දක්වයි.
මාර්ක් ෂුල්ටිස්

9
ඔබට ද දක්ෂ විය හැකිය. for(var i = 0, l = myArray.length; i < l; ++i) ...ඉදිරි පුනරාවර්තනය සමඟ ඔබට ලබා ගත හැකි වේගවත්ම හා හොඳම වේ.
මැතිව් අමියට්

Answers:


1566

හේතුව එක් ඉදිකිරීමක්:

var a = []; // Create a new empty array.
a[5] = 5;   // Perfectly legal JavaScript that resizes the array.

for (var i = 0; i < a.length; i++) {
    // Iterate over numeric indexes from 0 to 5, as everyone expects.
    console.log(a[i]);
}

/* Will display:
   undefined
   undefined
   undefined
   undefined
   undefined
   5
*/

සමහර විට අනෙකට වඩා සම්පූර්ණයෙන්ම වෙනස් විය හැකිය:

var a = [];
a[5] = 5;
for (var x in a) {
    // Shows only the explicitly set index of "5", and ignores 0-4
    console.log(x);
}

/* Will display:
   5
*/

එසේම, ඒ ගැන සලකා JavaScript ඔබට නිර්මාණය ඕනෑම මාලාවක් බලපානු ඇත අතර, පුස්තකාල මේ වගේ දේවල් කරන්න පුළුවන්:

// Somewhere deep in your JavaScript library...
Array.prototype.foo = 1;

// Now you have no idea what the below code will do.
var a = [1, 2, 3, 4, 5];
for (var x in a){
    // Now foo is a part of EVERY array and 
    // will show up here as a value of 'x'.
    console.log(x);
}

/* Will display:
   0
   1
   2
   3
   4
   foo
*/


146
Browth තිහාසිකව, සමහර බ්‍රව්සර් 'දිග', 'ටෝස්ට්‍රිං' යනාදිය හරහා නැවත යෙදී ඇත!
බොබින්ස්

398
භාවිතා (var x in a)කිරීමට මතක තබා ගන්න (x in a)- ගෝලීය නිර්මාණය කිරීමට අවශ්‍ය නැත.
ක්‍රිස් මෝගන්

79
පළමු නිකුතුව එය නරක වීමට හේතුවක් නොවේ, අර්ථකථනයේ වෙනසක් පමණි. දෙවන කාරණය මට පෙනෙන්නේ (පුස්තකාලයන් අතර ඇති වන ගැටුම් වලදී) බිල්ට් ඩේටා ටයිප් එකක මූලාකෘතිය වෙනස් කිරීම නරක යැයි සිතනවාට වඩා නරක බවයි.
ස්ටුවර්ට්

86
St ස්ටුවර්ට්: JS හි ඇති සියලුම වස්තු සහායක වේ. ජේඑස් අරාව යනු වස්තුවකි, එබැවින් ඔව්, එය ද අනුබද්ධ වේ, නමුත් එය ඒ සඳහා නොවේ. ඔබට වස්තුවක යතුරු හරහා නැවත යෙදීමට අවශ්‍ය නම් භාවිතා කරන්න for (var key in object). කෙසේ වෙතත්, අරාවෙහි මූලද්‍රව්‍යයන් නැවත කියවීමට ඔබට අවශ්‍ය නම් , භාවිතා කරන්න for(var i = 0; i < array.length; i += 1).
මාර්ටිජන්

42
ඔබ පළමු උදාහරණය සඳහා පැවසුවේ එය සංඛ්‍යාත්මක දර්ශක 0 සිට 4 දක්වා වෙනස් කරන බවයි, සෑම කෙනෙකුම අපේක්ෂා කරන පරිදි , එය 0 සිට 5 දක්වා පුනරාවර්තනය වනු ඇතැයි මම අපේක්ෂා කරමි ! ඔබ 5 වන ස්ථානයේ මූලද්‍රව්‍යයක් එකතු කළහොත්, අරාවෙහි මූලද්‍රව්‍ය 6 ක් ඇත (ඒවායින් 5 ක් නිර්වචනය කර නැත).
stivlo

395

මෙම for-inවිසින්ම ප්රකාශය "නරක පුරුදු" නොවේ, කෙසේ වෙතත් එය විය හැකි වැරදි අර්ථයක් ඇති වන භාවිතා , උදාහරණයක් ලෙස, කිරීමට අවංකව පෙලගැස්මක් හෝ අරා වැනි වස්තූන්.

for-inප්‍රකාශයේ පරමාර්ථය වන්නේ වස්තු ගුණාංග ගණනය කිරීමයි. මෙම ප්රකාශය, පතිරූපක දාම දැවී ගොස් ඇත ද වැඩි කරගැනීම් විස්තර උරුම දෙයක් බව ගුණ, සමහර විට එය අපේක්ෂා නොකරන .

එසේම, පුනරාවර්තනයේ අනුපිළිවෙල පිරිවිතරයෙන් සහතික නොවේ. එයින් අදහස් කරන්නේ ඔබට අරාව වස්තුවක් "නැවත" කිරීමට අවශ්‍ය නම්, මෙම ප්‍රකාශය සමඟ සංඛ්‍යා (අනුපිළිවෙල දර්ශක) සංඛ්‍යා අනුපිළිවෙලට පැමිණෙනු ඇති බවට ඔබට සහතික විය නොහැක.

උදාහරණයක් ලෙස, JScript (IE <= 8) හි, ගුණාංග නිර්මාණය කරන විට අරාව වස්තු මත පවා ගණන් කිරීමේ අනුපිළිවෙල අර්ථ දැක්වේ:

var array = [];
array[2] = 'c';
array[1] = 'b';
array[0] = 'a';

for (var p in array) {
  //... p will be "2", "1" and "0" on IE
}

එසේම, උරුම වූ දේපල ගැන කථා කිරීම, ඔබ, උදාහරණයක් ලෙස, Array.prototypeවස්තුව දිගු කළහොත් (MooTools වැනි සමහර පුස්තකාල මෙන්), එම ගුණාංග ද ගණන් ගනු ලැබේ:

Array.prototype.last = function () { return this[this.length-1]; };

for (var p in []) { // an empty array
  // last will be enumerated
}

මම පෙර කී ලෙස කැපීපෙනේ පෙලගැස්මක් හෝ අරා වැනි වස්තූන්, හොඳම දේ භාවිතා කිරීමට සිදු වේ අනුක්රමික පුඩුවක් එවැනි සරල වයස ලෙස, for/ whileපුඩුවක්.

ඔබට වස්තුවක ගුණාංග පමණක් උරුම කර ගැනීමට අවශ්‍ය වූ විට (උරුම නොවූ ඒවා), ඔබට මෙම hasOwnPropertyක්‍රමය භාවිතා කළ හැකිය :

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    // prop is not inherited
  }
}

Object.prototypeකවුරුහරි hasOwnPropertyඅපේ වස්තුවට නම් කළ දේපලක් එකතු කළහොත් ගැටළු ඇතිවීම වළක්වා ගැනීම සඳහා සමහර අය කෙලින්ම මෙම ක්‍රමය ඇමතීමට නිර්දේශ කරති :

for (var prop in obj) {
  if (Object.prototype.hasOwnProperty.call(obj, prop)) {
    // prop is not inherited
  }
}

10
ඩේවිඩ් හම්ෆ්රිගේ පෝස්ට් ද බලන්න ජාවාස්ක්‍රිප්ට් හි ඇති වස්තූන් ඉක්මණින් විග්‍රහ කිරීම - අරාව for..in“සාමාන්‍ය” ලූපවලට වඩා මන්දගාමී වේ.
ක්‍රිස් මෝගන්

17
"HasOwnProperty" පිළිබඳ අවසාන කරුණ පිළිබඳ ප්‍රශ්නය: යමෙකු වස්තුවක් මත "hasOwnProperty" අභිබවා ගියහොත් ඔබට ගැටළු ඇති වේ. යමෙකු "Object.prototype.hasOwnProperty" අභිබවා ගියහොත් ඔබට සමාන ගැටළු ඇති නොවේද? කෙසේ හෝ ඔවුන් ඔබව රවටා ඇති අතර එය ඔබේ වගකීම නොවේද?
ස්කොට් රිපී

ඔබ කියන්නේ for..inනරක පුරුද්දක් නොවන නමුත් එය අනිසි ලෙස භාවිතා කළ හැකිය. උරුම වූ දේපල ඇතුළු සියලු වස්තු ගුණාංග හරහා යාමට ඔබට සැබවින්ම අවශ්‍ය වූ හොඳ භාවිතයේ සැබෑ ලෝක උදාහරණයක් ඔබට තිබේද?
rjmunro

4
C ස්කොට්රිපි: ඔබට එය එතැනට ගෙන යාමට අවශ්‍ය නම්: youtube.com/watch?v=FrFUI591WhI
නේතන් වෝල්

මෙම පිළිතුර සමඟ වටිනාකමට ප්‍රවේශ විය හැකි බව මට පෙනී for (var p in array) { array[p]; }
ගියේය

119

for..inඅරාවෙහි මූලද්‍රව්‍යයන් නැවත සැකසීමට ඔබ භාවිතා නොකිරීමට හේතු තුනක් තිබේ :

  • for..inනැති අරාව වස්තුවෙහි සියලු සහ උරුම වූ ගුණාංග ඉක්මවා යයි DontEnum; එයින් අදහස් වන්නේ යමෙකු නිශ්චිත අරාව වස්තුවට ගුණාංග එකතු කළහොත් (මේ සඳහා වලංගු හේතු තිබේ - මම එසේ කර ඇත්තෙමි) හෝ වෙනස් කර ඇත Array.prototype(එය වෙනත් ස්ක්‍රිප්ට් සමඟ හොඳින් ක්‍රියා කළ යුතු කේතයේ නරක පුරුද්දක් ලෙස සලකනු ලැබේ), මෙම ගුණාංග නැවත නැවත කියන්න; පරික්ෂා කිරීමෙන් උරුම වූ ගුණාංග බැහැර කළ හැකි hasOwnProperty()නමුත්, අරාව වස්තුව තුළම සැකසූ ගුණාංග සඳහා එය ඔබට උදව් නොකරනු ඇත

  • for..in මූලද්‍රව්‍ය අනුපිළිවෙල ආරක්ෂා කිරීමට සහතික නොවේ

  • එය මන්දගාමී බැවින් ඔබට අරාව වස්තුවේ සියලු ගුණාංග සහ එහි සමස්ත මූලාකෘති දාමය ගමන් කළ යුතු අතර දේපලෙහි නම පමණක් ලැබෙනු ඇත, එනම් වටිනාකම ලබා ගැනීම සඳහා අතිරේක විමසුමක් අවශ්‍ය වේ


56

මක්නිසාද යත් ... අරාව රඳවාගෙන සිටින වස්තුව හරහා ගණනය කිරීමේදී මිස අරාවම නොවේ. මම අරා මූලාකෘති දාමයට ශ්‍රිතයක් එකතු කළහොත් එයද ඇතුළත් වේ. එනම්

Array.prototype.myOwnFunction = function() { alert(this); }
a = new Array();
a[0] = 'foo';
a[1] = 'bar';
for(x in a){
 document.write(x + ' = ' + a[x]);
}

මෙය ලියනු ඇත:

0 = foo
1 = තීරුව
myOwnFunction = ශ්‍රිතය () {අනතුරු ඇඟවීම (මෙය); }

මූලාකෘති දාමයට කිසිවක් එකතු නොවන බවට ඔබට කිසි විටෙකත් සහතික විය නොහැකි බැවින් අරාව ගණනය කිරීම සඳහා ලූපයක් භාවිතා කරන්න:

for(i=0,x=a.length;i<x;i++){
 document.write(i + ' = ' + a[i]);
}

මෙය ලියනු ඇත:

0 = foo
1 = තීරුව

17
අරා යනු වස්තු වේ, "අරාව රඳවා ගන්නා වස්තුවක්" නොමැත.
රොබ්

එබැවින් මෙම නඩුවේ වඩා හොඳ ප්‍රකාශයක් නම්: "අරා සඳහා භාවිතා නොකරන්න, මන්ද ඔබ මූලාකෘතියට එකතු කරන ඕනෑම දෙයක් එයට ඇතුළත් වනු ඇත"?
අයිසැක් පාක්

40

හුදකලා කිරීමේදී, අරා සඳහා for-in භාවිතා කිරීමේ කිසිදු වරදක් නොමැත. වස්තුවක දේපල නාමයන් සඳහා නැවත නැවත යෙදෙන අතර, "පිටත සිට" අරාව සම්බන්ධයෙන්, ගුණාංග අරාව දර්ශක වලට අනුරූප වේ. (ගොඩනඟන ලද නිසි පරිදි length, toStringසහ යනාදිය පුනරාවර්තනයට ඇතුළත් නොවේ.)

කෙසේ වෙතත්, ඔබේ කේතය (හෝ ඔබ භාවිතා කරන රාමුව) අරා වලට හෝ අරාව මූලාකෘතියට අභිරුචි ගුණාංග එකතු කරන්නේ නම්, මෙම ගුණාංග නැවත සැකසීමට ඇතුළත් වනු ඇත, එය බොහෝ විට ඔබට අවශ්‍ය දේ නොවේ.

මූලාකෘති වැනි සමහර JS රාමු අරාව මූලාකෘතිය වෙනස් කරයි. JQuery වැනි වෙනත් රාමු එසේ නොවේ, එබැවින් JQuery සමඟ ඔබට ආරක්ෂිතව භාවිතා කළ හැකිය.

ඔබට සැකයක් ඇත්නම්, ඔබ බොහෝ විට භාවිතා කිරීම නොකළ යුතුය.

අරාව හරහා නැවත යෙදීම සඳහා විකල්ප ක්‍රමයක් වන්නේ for-loop එකක් භාවිතා කිරීමයි:

for (var ix=0;ix<arr.length;ix++) alert(ix);

කෙසේ වෙතත්, මෙය වෙනස් ගැටළුවක් ඇත. ගැටළුව වන්නේ ජාවාස්ක්‍රිප්ට් අරාවකට "සිදුරු" තිබිය හැකිය. ඔබ මෙසේ අර්ථ දක්වන්නේ arrනම්:

var arr = ["hello"];
arr[100] = "goodbye";

එවිට අරාවෙහි අයිතම දෙකක් ඇත, නමුත් දිග 101 කි. For-in භාවිතා කිරීමෙන් දර්ශක දෙකක් ලැබෙනු ඇති අතර, for-loop මඟින් දර්ශක 101 ක් ලබා දෙනු ඇත, එහිදී 99 හි අගය ඇත undefined.


37

for…ofජෝන් ස්ලෙගර්ස් දැනටමත් දැක ඇති පරිදි, 2016 (ES6) වන විට අපි අරාව පුනරාවර්තනය සඳහා භාවිතා කළ හැකිය .

දේවල් පැහැදිලි කිරීම සඳහා මෙම සරල නිරූපණ කේතය එක් කිරීමට මම කැමතියි:

Array.prototype.foo = 1;
var arr = [];
arr[5] = "xyz";

console.log("for...of:");
var count = 0;
for (var item of arr) {
    console.log(count + ":", item);
    count++;
    }

console.log("for...in:");
count = 0;
for (var item in arr) {
    console.log(count + ":", item);
    count++;
    }

කොන්සෝලය පෙන්වන්නේ:

for...of:

0: undefined
1: undefined
2: undefined
3: undefined
4: undefined
5: xyz

for...in:

0: 5
1: foo

වෙනත් විදිහකින්:

  • for...of0 සිට 5 දක්වා ගණන් කරන අතර නොසලකා හරියි Array.prototype.foo. එය අරාව අගයන් පෙන්වයි .

  • for...inලැයිස්තුගත කරන්නේ 5, නිර්වචනය නොකළ අරාව දර්ශක නොසලකා හැරීම, නමුත් එකතු කිරීම පමණි foo. එය අරාව දේපල නම් පෙන්වයි .


33

කෙටි පිළිතුර: එය වටින්නේ නැත.


දීර් answer පිළිතුර: අනුක්‍රමික මූලද්‍රව්‍ය අනුපිළිවෙල සහ ප්‍රශස්ත ක්‍රියාකාරිත්වය අවශ්‍ය නොවුවද එය වටින්නේ නැත.


දිගු පිළිතුර: එය වටින්නේ නැත ...

  • භාවිතා කිරීම වස්තුවක් ලෙස නැවත සැකසීමට for (var property in array)හේතු වන අතර, වස්තු මූලාකෘති දාමය හරහා ගමන් කර අවසානයේ දර්ශක පාදක ලූපයකට වඩා මන්දගාමීව ක්‍රියා කරයි.arrayfor
  • for (... in ...) යමෙකු අපේක්ෂා කළ පරිදි, වස්තු ගුණාංග අනුක්‍රමික අනුපිළිවෙලට ආපසු ලබා දීමට සහතික නොවේ.
  • වස්තු ගුණාංග පෙරීම සඳහා භාවිතා කිරීම hasOwnProperty()සහ !isNaN()පරීක්ෂා කිරීම අතිරේක පොදු කාර්යයක් වන අතර එය ඊටත් වඩා මන්දගාමී වීමට හේතු වන අතර එය මුලින් භාවිතා කිරීමට ප්‍රධාන හේතුව ප්‍රතික්ෂේප කරයි, එනම් වඩාත් සංක්ෂිප්ත ආකෘතිය නිසා.

මෙම හේතු නිසා කාර්ය සාධනය සහ පහසුව අතර පිළිගත හැකි වෙළඳාමක් පවා නොපවතී. අරාව වස්තුවක් ලෙස හැසිරවීම සහ අරාවෙහි වස්තු ගුණාංග මත මෙහෙයුම් සිදු කිරීම හැරෙන්නට කිසිදු ප්‍රතිලාභයක් නොමැත .


31

වෙනත් පිළිතුරු වල දක්වා ඇති හේතු වලට අමතරව, ඔබට කවුන්ටරයේ විචල්‍යය සමඟ ගණිතය කිරීමට අවශ්‍ය නම් "සඳහා ... in" ව්‍යුහය භාවිතා කිරීමට ඔබට අවශ්‍ය නොවනු ඇත, මන්දයත් ලූපය වස්තුවේ ගුණාංගවල නම් හරහා පුනරාවර්තනය වන අතර විචල්‍යය නූලකි.

උදාහරණයක් වශයෙන්,

for (var i=0; i<a.length; i++) {
    document.write(i + ', ' + typeof i + ', ' + i+1);
}

ලියනු ඇත

0, number, 1
1, number, 2
...

ෙකෙසේෙවතත්,

for (var ii in a) {
    document.write(i + ', ' + typeof i + ', ' + i+1);
}

ලියනු ඇත

0, string, 01
1, string, 11
...

ඇත්ත වශයෙන්ම, ඇතුළත් කිරීමෙන් මෙය පහසුවෙන් ජය ගත හැකිය

ii = parseInt(ii);

ලූපය තුළ, නමුත් පළමු ව්‍යුහය වඩාත් .ජු ය.


6
ඔබට පූර්ණ සංඛ්‍යාවක් අවශ්‍ය නම් හෝ අවලංගු අක්ෂර නොසලකා හැරීම +වෙනුවට parseIntඔබට උපසර්ගය භාවිතා කළ හැකිය .
කොන්රාඩ් බොරොව්ස්කි

එසේම, භාවිතා parseInt()කිරීම නිර්දේශ නොකරයි. උත්සාහ කරන්න parseInt("025");, එය අසාර්ථක වනු ඇත .
ඩෙරෙක් 朕 會 功夫

6
E ඩෙරෙක් 朕 會 功夫 - ඔබට අනිවාර්යයෙන්ම භාවිතා කළ හැකිය parseInt. ගැටළුව වන්නේ ඔබ රැඩික්ස් ඇතුළත් නොකළේ නම්, පැරණි බ්‍රව්සර් අංකය අර්ථ නිරූපණය කිරීමට උත්සාහ කළ හැකිය (මේ අනුව 025 අෂ්ටක වේ). මෙය ECMAScript 5 හි සවි කර ඇති නමුත් එය තවමත් සිදුවන්නේ "0x" වලින් ආරම්භ වන සංඛ්‍යා සඳහා ය (එය අංකය හෙක්ස් ලෙස අර්ථ නිරූපණය කරයි). ආරක්ෂිත පැත්තේ සිටීමට නම්, එවැනි අංකයක් සඳහන් කිරීමට රේඩික්ස් භාවිතා කරන්න parseInt("025", 10)- එය 10 වන පදනම නියම කරයි.
IAmTimCorey

23

කාරණය හැරුණු විට for... inසියලු ගණන් කළ නොහැකි ගුණාංග (එය "සියලු අරාව මූලද්‍රව්‍යයන්" ට සමාන නොවේ !), Http://www.ecma-international.org/publications/files/ECMA-ST/Ecma බලන්න -262.pdf , 12.6.4 (5 වන සංස්කරණය) හෝ 13.7.5.15 (7 වන සංස්කරණය):

ගුණාංග ගණනය කිරීමේ යාන්ත්‍ර විද්‍යාව හා අනුපිළිවෙල ... නිශ්චිතව දක්වා නැත ...

(මගේ අවධාරණය අවධාරණය කරන්න.)

එයින් අදහස් වන්නේ බ්‍රව්සරයකට අවශ්‍ය නම්, ඒවා ඇතුළත් කළ අනුපිළිවෙලෙහි ඇති ගුණාංග හරහා යා හැකි බවයි. නැතහොත් සංඛ්‍යාත්මක අනුපිළිවෙලින්. හෝ ශබ්දකෝෂ අනුපිළිවෙලින් ("30" "4" ට පෙර පැමිණෙන තැන! සියලු වස්තු යතුරු මතක තබා ගන්න - මේ අනුව, සියලු අරාව දර්ශක - ඇත්ත වශයෙන්ම නූල් වන අතර එමඟින් සම්පූර්ණ අර්ථය ලැබේ). එය වස්තූන් හැෂ් වගු ලෙස ක්‍රියාත්මක කරන්නේ නම් එය බාල්දියකින් ඒවා හරහා යා හැකිය. නැතහොත් එයින් කිසිවක් ගෙන "පසුපසට" එකතු කරන්න. බ්‍රව්සරයකට අහඹු ලෙස නැවත ක්‍රියා කළ හැකි අතර ECMA-262 අනුකූල විය හැකිය, එය එක් එක් දේපල හරියටම එක් වරක් බැලූ තාක් කල්.

ප්‍රායෝගිකව, බොහෝ බ්‍රව්සර් දැනට දළ වශයෙන් එකම අනුපිළිවෙලට නැවත යෙදීමට කැමතියි. නමුත් ඔවුන්ට කියන්න දෙයක් නැහැ. එය ක්‍රියාත්මක කිරීම විශේෂිත වන අතර වෙනත් ක්‍රමයක් වඩා කාර්යක්ෂම බව සොයාගතහොත් ඕනෑම වේලාවක වෙනස් විය හැකිය.

කෙසේ හෝ වේවා, for... ඒ inසමඟ අනුපිළිවෙලක් නැත. ඔබ ඇණවුම ගැන සැලකිලිමත් වන්නේ නම්, ඒ පිළිබඳව පැහැදිළි වන්න සහ forදර්ශකයක් සමඟ සාමාන්‍ය ලූපයක් භාවිතා කරන්න .


18

ප්රධාන වශයෙන් හේතු දෙකක්:

එක

අනෙක් අය පවසා ඇති පරිදි, ඔබේ අරාවෙහි නොමැති හෝ මූලාකෘතියෙන් උරුම වූ යතුරු ඔබට ලැබෙනු ඇත. එබැවින්, පුස්තකාලයක් අරාව හෝ වස්තු මූලාකෘති වලට දේපලක් එකතු කරන්නේ නම්:

Array.prototype.someProperty = true

සෑම අරාවකම කොටසක් ලෙස ඔබට එය ලැබෙනු ඇත:

for(var item in [1,2,3]){
  console.log(item) // will log 1,2,3 but also "someProperty"
}

ඔබට මෙය hasOwnProperty ක්‍රමය සමඟ විසඳා ගත හැකිය:

var ary = [1,2,3];
for(var item in ary){
   if(ary.hasOwnProperty(item)){
      console.log(item) // will log only 1,2,3
   }
}

නමුත් ඕනෑම වස්තුවක් සඳහා ලූපයක් සමඟ නැවත යෙදීම සඳහා මෙය සත්‍ය වේ.

දෙක

සාමාන්‍යයෙන් අරාවෙහි ඇති අයිතමවල අනුපිළිවෙල වැදගත් වේ, නමුත් for-in loop අනිවාර්යයෙන්ම නිවැරදි අනුපිළිවෙලට පුනරාවර්තනය නොවනු ඇත, එයට හේතුව එය අරාව වස්තුවක් ලෙස සලකන නිසාය, එය JS හි ක්‍රියාත්මක වන ආකාරය මිස නොවේ අරාව ලෙස. මෙය කුඩා දෙයක් සේ පෙනේ, නමුත් එය සැබවින්ම යෙදුම් ඉස්කුරුප්පු කළ හැකි අතර එය නිදොස් කිරීමට අපහසුය.


2
Object.keys(a).forEach( function(item) { console.log(item) } )මූලාකෘතියෙන් උරුම වූ ඒවා නොව, දේපල යතුරු සමූහයක් හරහා නැවත ක්‍රියා කරන්න.
Qwerty

2
ඇත්ත, නමුත් for-in loop මෙන් එය අනිවාර්යයෙන්ම නිවැරදි දර්ශක අනුපිළිවෙලට නොතිබෙනු ඇත. එසේම, එය පැරණි බ්‍රව්සර් මත ES5 සඳහා සහය නොදක්වයි.
ලයර්

array.forEachඔබේ ස්ක්‍රිප්ට් වල යම් කේතයක් ඇතුළත් කිරීමෙන් ඔබට එම බ්‍රව්සර් ඉගැන්විය හැකිය . පොලිෆිල් සංවර්ධක.
Qwerty

ඇත්ත වශයෙන්ම, නමුත් ඔබ මූලාකෘතිය හසුරුවන අතර එය සැමවිටම හොඳ අදහසක් නොවේ ... තවමත් ඔබට ඇණවුමේ ගැටලුව තිබේ ...
Lior

ඇත්ත වශයෙන්ම, හේතුව අංක තුන: විරල අරා.
වඩා හොඳ ඔලිවර්

16

මන්ද එය ගණනය කරනු ලබන්නේ දර්ශක නොව වස්තු ක්ෂේත්‍ර හරහා ය. ඔබට "දිග" දර්ශකය සමඟ අගය ලබා ගත හැකි අතර ඔබට මෙය අවශ්‍ය යැයි මම සැක කරමි.


ඉතින් එය කළ හැකි හොඳම ක්‍රමය කුමක්ද?
lYriCAlsSH

3
සඳහා (var i = 0; i <arr.length; i ++) {}
vava

3
ෆයර්ෆොක්ස් 3 හි ඔබට arr.forEach හෝ (var [i, v] Iterator (arr)) for} සඳහා භාවිතා කළ හැකිය}} නමුත් IE හි එම කෘති කිසිවක් ඔබට සෑම ක්‍රමයක් සඳහාම ලිවිය හැකි වුවද.
vava

සෑම පුස්තකාලයකම පාහේ මේ සඳහා තමන්ගේම ක්‍රමවේදයක් ඇත.
vava

5
මෙම පිළිතුර වැරදිය. පුනරාවර්තනය සඳහා "දිග" ඇතුළත් නොවේ. එය ඔබ විසින්ම එකතු කරන ලද ගුණාංග පමණි.
ජැක් බී

16

උදා: මට එකතු කිරීමට බොහෝ දේ ඇතැයි මම නොසිතමි. සමහර අවස්ථාවල භාවිතා කිරීම වළක්වා ගත යුත්තේ ඇයිද යන්න පිළිබඳ ට්‍රිප්ටිච්ගේ පිළිතුර හෝ සීඑම්එස් පිළිතුරfor...in .

කෙසේ වෙතත්, නවීන බ්‍රව්සර්වලfor...in භාවිතා for...inකළ නොහැකි අවස්ථාවන්හිදී ඒ සඳහා විකල්පයක් ඇති බව මම එකතු කිරීමට කැමැත්තෙමි . එම විකල්පය නම් for...of:

for (var item of items) {
    console.log(item);
}

සටහන :

අවාසනාවකට මෙන්, ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් හි කිසිදු සංස්කරණයක් සහාය නොදක්වයි for...of( එජ් 12+ එසේ නොකරයි), එබැවින් ඔබට එය ඔබේ සේවාදායක පාර්ශව නිෂ්පාදන කේතයේ භාවිතා කිරීමට හැකි වන තෙක් මඳ වේලාවක් බලා සිටීමට සිදු වේ. කෙසේ වෙතත්, ඔබගේ සේවාදායක පැත්තේ JS කේතය භාවිතා කිරීම ආරක්ෂිත විය යුතුය (ඔබ Node.js භාවිතා කරන්නේ නම් ).


@georgeawg ඔබ අදහස් කළේ for-ofනේද for-in?
ᆼ ᆺ ᆼ

15

ගැටලුව for ... in ...- සහ මෙය ගැටළුවක් බවට පත්වන්නේ ක්‍රමලේඛකයෙකුට භාෂාව සැබවින්ම නොතේරෙන විට පමණි; එය සැබවින්ම දෝෂයක් හෝ කිසිවක් නොවේ - එය වස්තුවක සියලුම සාමාජිකයින්ට වඩා ඉහළින් ක්‍රියා කරයි (හොඳයි, සියලු ගණන් කළ හැකි සාමාජිකයන්, නමුත් එය දැනට විස්තරයකි). ඔබ කෙරෙහි වඩාත් කැපීපෙනේ යාමට අවශ්ය වූ විට පමණක් මාලාවක් වන සුචිගත ගුණ, ශබ්දාර්ථයෙන් ස්ථාවර දේවල් තබා ගැනීමට පමණක් සහතික ක්රමය යනු පූර්ණ සංඛ්යාවකි දර්ශකය භාවිතා කිරීමට (එනම්, යනු for (var i = 0; i < array.length; ++i)ශෛලිය පුඩුවක්).

ඕනෑම වස්තුවකට ඒ හා සම්බන්ධ අත්තනෝමතික ගුණාංග තිබිය හැකිය. අතිරේක ගුණාංග අරා උදාහරණයකට පැටවීම ගැන භයානක දෙයක් නැත. සුචිගත කරන ලද අරාව වැනි ගුණාංග පමණක් දැකීමට අවශ්‍ය කේතය පූර්ණ සංඛ්‍යා දර්ශකයකට ඇලී සිටිය යුතුය . සියලු දේ දැකීමට අවශ්‍ය දේ for ... inසහ සැබවින්ම අවශ්‍ය වන කේතය , එයද හරි.


හොඳ පැහැදිලි කිරීමක් පොයින්ටි. කුතුහලයෙන්. ගුණ කිරීමේ ගුණාංග යටතේ වස්තුවක් තුළ ඇති අරාවක් මා සතුව තිබේ නම් සහ for inසාමාන්‍ය ලූපයක් සමඟ සසඳන විට, එම අරා නැවත ක්‍රියාත්මක වේ ද? (සාරාංශයක් ලෙස, මන්දගාමී ක්‍රියාකාරිත්වය, හරිද?)
නික් නිව්මන්

2
@NiCkNewman ඔබ පසු අදාල හොඳින් වස්තුව inදී for ... inපුඩුවක් පමණක් වනු ඇත
නෙල්ලඩි

මට පේනවා. මගේ ප්‍රධාන ක්‍රීඩා වස්තුව තුළ වස්තූන් සහ අරා ඇති නිසා කුතුහලයෙන් සිටින අතර ඉනිම සඳහා එය වඩාත් වේදනාකාරී වේ දැයි කල්පනා කරමින් සිටියේ සුචිය මත ලූප සඳහා නිතිපතා ය.
නික් නිව්මන්

@NiCkNewman මෙම සමස්ත ප්‍රශ්නයේ තේමාව වන්නේ ඔබ for ... inඅරා වල පමණක් භාවිතා නොකළ යුතු බවයි ; එසේ නොකිරීමට බොහෝ හොඳ හේතු තිබේ. එය "එය බිඳී නොයන බවට වග බලා ගන්න" ලෙස කාර්ය සාධන ගැටලුවක් නොවේ.
පොයින්ටි

හොඳයි, මගේ වස්තූන් තාක්‍ෂණිකව අරාව තුළ ගබඩා කර ඇත, ඒ නිසා මම කනස්සල්ලට පත්ව සිටිමි, වැනි දෙයක් : [{a:'hey',b:'hi'},{a:'hey',b:'hi'}], නමුත් ඔව්, මට තේරෙනවා.
NiCk Newman

9

එසේම, අර්ථ නිරූපණය හේතුවෙන්, for, inඅරා සලකන ආකාරය (එනම් වෙනත් ජාවාස්ක්‍රිප්ට් වස්තුවකට සමාන) වෙනත් ජනප්‍රිය භාෂාවන් සමඟ නොගැලපේ.

// C#
char[] a = new char[] {'A', 'B', 'C'};
foreach (char x in a) System.Console.Write(x); //Output: "ABC"

// Java
char[] a = {'A', 'B', 'C'};
for (char x : a) System.out.print(x);          //Output: "ABC"

// PHP
$a = array('A', 'B', 'C');
foreach ($a as $x) echo $x;                    //Output: "ABC"

// JavaScript
var a = ['A', 'B', 'C'];
for (var x in a) document.write(x);            //Output: "012"

9

ටීඑල් ඇන්ඩ් ඩීආර්:for in අරා වල ලූප භාවිතා කිරීම නපුරක් නොවේ, ඇත්ත වශයෙන්ම ඊට හාත්පසින්ම වෙනස් ය.

අරා වල නිවැරදිවfor in භාවිතා කරන්නේ නම් ලූපය JS හි මැණික් වර්ගයක් යැයි මම සිතමි . ඔබේ මෘදුකාංගය පිළිබඳ පූර්ණ පාලනයක් ඔබ අපේක්ෂා කරන අතර ඔබ කරන්නේ කුමක්දැයි දැන ගනු ඇත. අපි සඳහන් කළ අඩුපාඩු දෙස බලා ඒවා එකින් එක ප්‍රතික්ෂේප කරමු.

  1. එය උරුම වූ දේපල හරහා ද ලූප වේ: පළමුවෙන්ම කළ යුතු ඕනෑම දිගුවක් Array.prototypeභාවිතා කිරීමෙන් සිදු කළ යුතු Object.defineProperty()අතර ඒවායේ enumerableවිස්තරය සැකසිය යුතුය false. එසේ නොකරන ඕනෑම පුස්තකාලයක් කිසිසේත් භාවිතා නොකළ යුතුය.
  2. උරුම දාමයට ඔබ එකතු කරන ගුණාංග පසුව ගණන් ගනු ලැබේ: පන්තියෙන් Object.setPrototypeOfහෝ අනුව අරා උප වර්ගීකරණය කරන විට extend. නැවත භාවිත කළ යුතුය Object.defineProperty()පෙරනිමි කට්ටල විසින් කරන writable, enumerableසහ configurableදේපළ විස්තරයන් කිරීමට false. අරාව උප වර්ගීකරණ උදාහරණයක් මෙහි බලමු ...

function Stack(...a){
  var stack = new Array(...a);
  Object.setPrototypeOf(stack, Stack.prototype);
  return stack;
}
Stack.prototype = Object.create(Array.prototype);                                 // now stack has full access to array methods.
Object.defineProperty(Stack.prototype,"constructor",{value:Stack});               // now Stack is a proper constructor
Object.defineProperty(Stack.prototype,"peak",{value: function(){                  // add Stack "only" methods to the Stack.prototype.
                                                       return this[this.length-1];
                                                     }
                                             });
var s = new Stack(1,2,3,4,1);
console.log(s.peak());
s[s.length] = 7;
console.log("length:",s.length);
s.push(42);
console.log(JSON.stringify(s));
console.log("length:",s.length);

for(var i in s) console.log(s[i]);

ඉතින් ඔබට පෙනේ .. for inඔබ ඔබේ කේතය ගැන සැලකිලිමත් වූ බැවින් දැන් ලූපය ආරක්ෂිතයි.

  1. මෙම for inලූපය මන්දගාමී වේ: නිරය නැත. වරින් වර අවශ්‍ය වන විරල අරා හරහා ඔබ ලූපයක් ඇත්නම් එය වේගවත්ම පුනරාවර්තන ක්‍රමය වේ. මෙය යමෙකු දැනගත යුතු වැදගත්ම කාර්ය සාධන උපක්‍රමයකි. උදාහරණයක් බලමු. අපි විරල අරාවකට උඩින් ලූප් කරන්නෙමු.

var a = [];
a[0] = "zero";
a[10000000] = "ten million";
console.time("for loop on array a:");
for(var i=0; i < a.length; i++) a[i] && console.log(a[i]);
console.timeEnd("for loop on array a:");
console.time("for in loop on array a:");
for(var i in a) a[i] && console.log(a[i]);
console.timeEnd("for in loop on array a:");


Av රවි ශංකර් රෙඩ්ඩි හොඳ මිණුම් සලකුණු කිරීම. මගේ පිළිතුරේ මා සඳහන් කර ඇති පරිදි for in, අරාව විරල නම් “විශාල නම්” අනෙක් ඒවා ඉස්මතු කරයි. එබැවින් මම arr~ 10000 ප්‍රමාණයේ විරල අරාවක් සඳහා බංකුවේ පරීක්ෂණය නැවත සකස් කර [42,"test",{t:1},null, void 0]ඇත්තේ අහඹු ලෙස දර්ශක අතර අහඹු ලෙස තෝරාගත් අයිතම 50 ක් පමණි . ඔබ වහාම වෙනස දකිනු ඇත. - >> එය මෙහි පරීක්ෂා කරන්න << - .
Redu

8

අනෙක් ගැටළු වලට අමතරව, "for..in" සින්ටැක්ස් බොහෝ විට මන්දගාමී වේ, මන්ද දර්ශකය යනු නූලක් මිස පූර්ණ සංඛ්‍යාවක් නොවේ.

var a = ["a"]
for (var i in a)
    alert(typeof i)  // 'string'
for (var i = 0; i < a.length; i++)
    alert(typeof i)  // 'number'

බොහෝ දුරට වැදගත් නොවේ. අරාව මූලද්‍රව්‍ය යනු අරාව මත පදනම් වූ හෝ අරාව වැනි වස්තුවක ගුණාංග වන අතර, සියලු වස්තු ගුණාංගවල යතුරු යතුරු ඇත. ඔබේ ජේඑස් එන්ජිම කෙසේ හෝ එය ප්‍රශස්තිකරණය නොකරන්නේ නම්, ඔබ අංකයක් භාවිතා කළත් එය අවසන් කිරීම සඳහා නූලක් බවට පත්වේ.
cHao

කිසියම් කාර්ය සාධන ගැටළු නොසලකා, ඔබ ජාවාස්ක්‍රිප්ට් වෙත නවකයෙක් නම්, var i in aදර්ශකය පූර්ණ සංඛ්‍යාවක් වනු ඇතැයි අපේක්ෂා කරන්න, එවිට යම් දෙයක් කිරීම a[i+offset] = <value>සම්පූර්ණයෙන්ම වැරදි ස්ථානවල අගයන් තැබීම වැනි ය. ("1" + 1 == "11").
szmoore

8

වැදගත් අංගයක් බව ය for...inගුණ වැඩි පමණක් දයානන්ද් ඔවුන්ගේ ඇති වස්තුවක් අඩංගු ගණ්ය දේපල විශේෂණය සැබෑ කිරීමට හැකි. එබැවින් යමෙකු යම් වස්තුවක් භාවිතා කර for...inනැවත උත්සාහ කිරීමට උත්සාහ කරන්නේ නම්, ඒවායේ ගණන් කළ නොහැකි දේපල ගුණාංගය අසත්‍ය නම් අත්තනෝමතික ගුණාංග මඟ හැරෙනු ඇත. සාමාන්‍ය අරා වස්තූන් සඳහා ගණන් කළ නොහැකි දේපල ගුණාංග වෙනස් කිරීමට හැකි වන අතර එමඟින් ඇතැම් මූලද්‍රව්‍ය ගණනය නොකෙරේ. පොදුවේ ගත් කල, දේපල ගුණාංග වස්තුවක් තුළ ඇති ක්‍රියාකාරී ගුණාංග සඳහා අදාළ වේ.

දේපලවල ගණන් කළ නොහැකි දේපල ගුණාංගයක වටිනාකම යමෙකුට පරීක්ෂා කළ හැකිය:

myobject.propertyIsEnumerable('myproperty')

නැතහොත් දේපල ගුණාංග හතරම ලබා ගැනීම සඳහා:

Object.getOwnPropertyDescriptor(myobject,'myproperty')

මෙය ECMAScript 5 හි ඇති අංගයකි - පෙර සංස්කරණ වලදී ගණන් කළ නොහැකි දේපල ගුණාංගයේ වටිනාකම වෙනස් කිරීමට නොහැකි විය (එය සැමවිටම සත්‍ය ලෙස සකසා ඇත).


8

මෙම for/ inhashtables (associative පෙලගැස්මක්) සහ අරා (-associative නොවන): විචල්ය වර්ග දෙකක් සමග ක්රියා කරයි.

ජාවාස්ක්‍රිප්ට් ස්වයංක්‍රීයව අයිතම හරහා ගමන් කරන ආකාරය තීරණය කරයි. එබැවින් ඔබේ අරාව සැබවින්ම සහායක නොවන බව ඔබ දන්නේ නම් ඔබට භාවිතා කළ හැකි for (var i=0; i<=arrayLen; i++)අතර ස්වයංක්‍රීයව හඳුනාගැනීමේ ක්‍රියාවලිය මඟ හරින්න.

නමුත් මගේ මතය, එය භාවිතා කිරීම වඩා හොඳ for/ inඒ ස්වයංක්රීය-හඳුනාගැනීම සඳහා අවශ්ය ක්රියාදාමය ඉතා කුඩා වේ.

මේ සඳහා සත්‍ය පිළිතුරක් රඳා පවතින්නේ බ්‍රව්සරය ජාවාස්ක්‍රිප්ට් කේතය විග්‍රහ කරන ආකාරය / අර්ථ නිරූපණය කරන ආකාරය මත ය. එය බ්‍රව්සර් අතර වෙනස් විය හැකිය.

මම භාවිතා නොකරන වෙනත් අරමුණු සිතා ගත නොහැකි for/ in;

//Non-associative
var arr = ['a', 'b', 'c'];
for (var i in arr)
   alert(arr[i]);

//Associative
var arr = {
   item1 : 'a',
   item2 : 'b',
   item3 : 'c'
};

for (var i in arr)
   alert(arr[i]);

ඇත්ත, ඔබ මූලාකෘති වස්තු භාවිතා නොකරන්නේ නම්. ;) පහළ
රිකාඩෝ

එහේ බෙහෙත් තිබුනේ නිසා ArrayObject
නිදහස් උපදේශන

2
for ... inවස්තූන් සමඟ ක්‍රියා කරයි. ස්වයංක්‍රීයව හඳුනා ගැනීම වැනි දෙයක් නොමැත.
වඩා හොඳ ඔලිවර්

7

මන්ද ඔබ පරෙස්සම් නොවන්නේ නම් එය මූලාකෘති දාමය දක්වා ඇති වස්තූන්ට අයත් දේපල මත නැවත ක්‍රියා කරයි.

ඔබට භාවිතා කළ හැකිය for.. in, hasOwnProperty සමඟ එක් එක් දේපල පරීක්ෂා කිරීමට වග බලා ගන්න .


2
ප්‍රමාණවත් නොවේ - අරා අවස්ථාවන් සඳහා අත්තනෝමතික ලෙස නම් කරන ලද ගුණාංග එකතු කිරීම හරි ය, ඒවා චෙක්පත් trueවලින් hasOwnProperty()පරීක්ෂා කරනු ඇත.
පොයින්ටි

හොඳ කරුණක්, ස්තූතියි. මම කවදාවත් අරාවකටම එය කිරීමට තරම් මෝඩ වී නැත, එබැවින් මම එය නොසැලකුවෙමි!
JAL

1
පොයින්ටි මම මෙය අත්හදා බලා නැත, නමුත් සමහර විට isNaNඑක් එක් දේපල නාමය පිළිබඳ චෙක්පතක් භාවිතා කිරීමෙන් මෙය ජය ගත හැකිය .
වයිනන්ඩ් බී

1
Yn රසවත් අදහස; කෙසේ වෙතත් සරල සංඛ්‍යාත්මක දර්ශකයක් සමඟ නැවත යෙදීම එතරම් පහසු වන්නේ මන්දැයි මට නොපෙනේ.
පොයින්ටි

Yn වයිනාන්ඩ් බම්ප් ගැන කණගාටුයි, නමුත් නිවැරදි කිරීමක් පිළිවෙලට ඇතැයි මට හැඟේ: isNaNවිචල්‍යයක් යනු NaN හි විශේෂ අගයද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා, එය 'සංඛ්‍යා හැර වෙනත් දේ' පරීක්ෂා කිරීමට භාවිතා කළ නොහැක (ඔබට නිතිපතා යන්න පුළුවන් ඒ සඳහා typeof).
ඩොල්ඩ්

6

එය අනිවාර්යයෙන්ම නරක නැත (ඔබ කරන දේ මත පදනම්ව), නමුත් අරා සම්බන්ධයෙන්, යමක් එකතු කර ඇත්නම් Array.prototype, එවිට ඔබට අමුතු ප්‍රති .ල ලැබෙනු ඇත. මෙම ලූපය තුන් වරක් ක්‍රියාත්මක වේ යැයි ඔබ අපේක්ෂා කරන තැන:

var arr = ['a','b','c'];
for (var key in arr) { ... }

නමින් කාර්යය නම් helpfulUtilityMethodද එක් කර ඇත Arrayගේ prototype, එසේ නම් ඔබේ පුඩුවක් හතර වතාවක් පවත්වා අවසන් බව: keyවනු ඇත 0, 1, 2, සහ helpfulUtilityMethod. ඔබ අපේක්‍ෂා කළේ පූර්ණ සංඛ්‍යා පමණක් නම්, අපොයි.


6

ඔබ භාවිතා කළ for(var x in y)යුත්තේ දේපල ලැයිස්තු මත මිස වස්තූන් මත නොවේ (ඉහත විස්තර කර ඇති පරිදි).


13
SO පිළිබඳ සටහනක් - 'ඉහත' කිසිවක් නොමැත, මන්ද අදහස් දැක්වීම් සෑම විටම පිටුවේ අනුපිළිවෙල වෙනස් කරයි. එබැවින්, ඔබ අදහස් කරන්නේ කුමන ප්‍රකාශයදැයි අපි නොදනිමු. මෙම හේතුව නිසා "x පුද්ගලයාගේ අදහස් දැක්වීමේදී" පැවසීම හොඳයි.
JAL

@JAL ... හෝ පිළිතුරට පර්මාලින්ක් එක් කරන්න.
වයිනන්ඩ් බී

5

for...inයමෙකු ඔබට එසේ කීවේ මන්දැයි මට අනුමාන කළ හැකි වුවද, අරාව සඳහා ලූපය භාවිතා කිරීම වැරදිය.

1.) දැනටමත් ඉහළ පෙළේ ශ්‍රිතයක් හෝ ක්‍රමයක් ඇත, එය අරාව සඳහා එම අරමුණ ඇත, නමුත් වැඩි ක්‍රියාකාරීත්වයක් සහ සිහින් සින්ටැක්ස් ඇත, එය 'forEach' ලෙස හැඳින්වේ: Array.prototype.forEach(function(element, index, array) {} );

2.) අරා සෑම විටම දිග ඇති, නමුත් for...inසහ forEachඇති ඕනෑම අගය සඳහා ක්රියාත්මක කරන්නේ නෑ 'undefined'අර්ථ අගය ඇති බව දර්ශක සඳහා පමණක්. එබැවින් ඔබ එක් අගයක් පමණක් පවරන්නේ නම්, මෙම ලූප මඟින් එක් වරක් පමණක් ශ්‍රිතයක් ක්‍රියාත්මක කරනු ඇත, නමුත් අරාව ගණනය කර ඇති බැවින්, එය සැමවිටම අර්ථ දක්වා ඇති ඉහළම දර්ශකය දක්වා දිගක් ඇත, නමුත් මේවා භාවිතා කරන විට එම දිග නොදැනේ. ලූප.

3.) ලූප් සඳහා වන ප්‍රමිතිය ඔබ පරාමිතීන් තුළ අර්ථ දක්වන වාර ගණනක් මෙන් ශ්‍රිතයක් ක්‍රියාත්මක කරනු ඇති අතර, අරාව අංකනය කර ඇති බැවින්, ඔබට ශ්‍රිතයක් ක්‍රියාත්මක කිරීමට අවශ්‍ය වාර ගණන නිර්වචනය කිරීම වඩාත් අර්ථවත් කරයි. අනෙක් ලූප මෙන් නොව, for for loop හට අගය අර්ථ දක්වා තිබුණත් නැතත් අරාවෙහි සෑම දර්ශකයක් සඳහාම ශ්‍රිතයක් ක්‍රියාත්මක කළ හැකිය.

සාරාංශයක් ලෙස, ඔබට ඕනෑම ලූපයක් භාවිතා කළ හැකිය, නමුත් ඒවා ක්‍රියා කරන ආකාරය ඔබ මතක තබා ගත යුතුය. විවිධ ලූපයන් පුනරුච්චාරණය කරන කොන්දේසි, ඒවායේ වෙනම ක්‍රියාකාරිත්වය සහ විවිධ අවස්ථා සඳහා ඒවා අඩු හෝ වැඩි වශයෙන් සුදුසු බව වටහා ගන්න.

එසේම, පොදුවේ ලූපයට forEachවඩා ක්‍රමවේදය භාවිතා කිරීම වඩා හොඳ භාවිතයක් ලෙස සැලකිය හැකිය for...in, මන්ද එය ලිවීමට පහසු වන අතර වැඩි ක්‍රියාකාරීත්වයක් ඇත, එබැවින් ඔබට මෙම ක්‍රමය සහ ප්‍රමිතිය පමණක් භාවිතා කිරීමේ පුරුද්ද ඇති කර ගැනීමට අවශ්‍ය විය හැකිය, නමුත් ඔබේ අමතන්න.

පළමු ලූප දෙක ක්‍රියාත්මක කරන්නේ එක් වරක් පමණක් console.log ප්‍රකාශයන් බව පහත බලන්න, ලූප් සඳහා වන ප්‍රමිතිය මඟින් ශ්‍රිතය නිශ්චිතව දක්වා ඇති වාර ගණනක් ක්‍රියාත්මක කරයි, මේ අවස්ථාවේ දී, array.length = 6.

var arr = [];
arr[5] = 'F';

for (var index in arr) {
console.log(index);
console.log(arr[index]);
console.log(arr)
}
// 5
// 'F'
// => (6) [undefined x 5, 6]

arr.forEach(function(element, index, arr) {
console.log(index);
console.log(element);
console.log(arr);
});
// 5
// 'F'
// => Array (6) [undefined x 5, 6]

for (var index = 0; index < arr.length; index++) {
console.log(index);
console.log(arr[index]);
console.log(arr);
};
// 0
// undefined
// => Array (6) [undefined x 5, 6]

// 1
// undefined
// => Array (6) [undefined x 5, 6]

// 2
// undefined
// => Array (6) [undefined x 5, 6]

// 3
// undefined
// => Array (6) [undefined x 5, 6]

// 4
// undefined
// => Array (6) [undefined x 5, 6]

// 5
// 'F'
// => Array (6) [undefined x 5, 6]

4

මෙය (සාමාන්‍යයෙන්) නරක පුරුද්දක් වීමට හේතු මෙන්න:

  1. for...inවළළු සියලු තමන්ගේ ගණ්ය ගුණ වැඩි වඩාත් කැපීපෙනේ හා ඔවුන්ගේ මූලාකෘතියක් (වල) ගණ්ය ගුණ. සාමාන්‍යයෙන් අරාව පුනරාවර්තනයක දී අපට අවශ්‍ය වන්නේ අරාව හරහා නැවත යෙදීම පමණි. ඔබ විසින්ම අරාව වෙත කිසිවක් එකතු නොකළද, ඔබේ පුස්තකාල හෝ රාමුව විසින් යමක් එකතු කළ හැකිය.

උදාහරණය :

Array.prototype.hithere = 'hithere';

var array = [1, 2, 3];
for (let el in array){
    // the hithere property will also be iterated over
    console.log(el);
}

  1. for...inලූප නිශ්චිත පුනරාවර්තන අනුපිළිවෙලක් සහතික නොකරයි . මේ දිනවල බොහෝ නවීන බ්‍රව්සර්වල ඇණවුම සාමාන්‍යයෙන් දක්නට ලැබුණද, තවමත් 100% සහතිකයක් නොමැත.
  2. for...inලූප මඟින් undefinedඅරාව මූලද්‍රව්‍ය නොසලකා හරිනු ලැබේ, එනම් තවමත් පවරා නොමැති අරාව මූලද්‍රව්‍ය.

උදාහරණය: :

const arr = []; 
arr[3] = 'foo';   // resize the array to 4
arr[4] = undefined; // add another element with value undefined to it

// iterate over the array, a for loop does show the undefined elements
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

console.log('\n');

// for in does ignore the undefined elements
for (let el in arr) {
    console.log(arr[el]);
}


2

ජාවාස්ක්‍රිප්ට් හි වස්තුවක් මත වැඩ කිරීමේදී ... in ප්‍රයෝජනවත් වේ, නමුත් අරාව සඳහා නොවේ, නමුත් තවමත් අපට එය වැරදි ක්‍රමයක් යැයි පැවසිය නොහැක, නමුත් එය නිර්දේශ කර නැත, පහත දැක්වෙන උදාහරණය බලන්න ... ලූප් සඳහා:

let txt = "";
const person = {fname:"Alireza", lname:"Dezfoolian", age:35}; 
for (const x in person) {
    txt += person[x] + " ";
}
console.log(txt); //Alireza Dezfoolian 35 

හරි, අපි දැන් අරේ සමඟ එය කරමු :

let txt = "";
const person = ["Alireza", "Dezfoolian", 35]; 
for (const x in person) {
   txt += person[x] + " ";
}
console.log(txt); //Alireza Dezfoolian 35 

ප්‍රති result ලය ඔබ දකින ආකාරයටම ...

ඒත් අපි උත්සාහ දෙයක්, එහෙනම් අපි මූලාකෘති දෙයක් කිරීමට ඉඩ Array ...

Array.prototype.someoneelse = "someoneelse";

දැන් අපි නව අරා () නිර්මාණය කරමු;

let txt = "";
const arr = new Array();
arr[0] = 'Alireza';
arr[1] = 'Dezfoolian';
arr[2] = 35;
for(x in arr) {
 txt += arr[x] + " ";
}
console.log(txt); //Alireza Dezfoolian 35 someoneelse

ඔබට යමෙක් පෙනේ !!! ... අපි ඇත්ත වශයෙන්ම මේ අවස්ථාවේ දී නව අරා වස්තුව හරහා ලූප ගසමු !

ඒ නිසා අපි භාවිතා කිරීමට අවශ්ය හේතු ගේ එක් බව for..in ප්රවේශමෙන්, නමුත් එය සැම විටම එය එසේ නොවේ ය ...


2

A for ... loop සෑම විටම යතුරු ගණනය කරයි. වස්තු ගුණාංග යතුරු සැමවිටම නූල් වේ, අරාවෙහි සුචිගත කළ ගුණාංග පවා:

var myArray = ['a', 'b', 'c', 'd'];
var total = 0
for (elem in myArray) {
  total += elem
}
console.log(total); // 00123

1

ජාවාස්ක්‍රිප්ට් මූලද්‍රව්‍ය සම්මත වස්තු ගුණාංග ලෙස සුරකින බැවින්, සාමාන්‍ය මූලද්‍රව්‍ය සහ සියලු ගණන් කළ හැකි ගුණාංග ලැයිස්තුගත වන හෙයින්, ලූප සඳහා ... ජාවාස්ක්‍රිප්ට් අරා හරහා ... ලූප සඳහා නැවත යෙදීම සුදුසු නොවේ.

Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections වෙතින්


1

මෙම ප්‍රශ්නයෙන් නිශ්චිතවම ආමන්ත්‍රණය නොකළද, කිසි විටෙකත් භාවිතා නොකිරීමට ඉතා හොඳ හේතුවක් ඇති බව මම එකතු කරමි ... NodeList( querySelectorAllඇමතුමකින් කෙනෙකු ලබා ගන්නා පරිදි , ආපසු එන මූලද්‍රව්‍යයන් කිසිසේත් නොපෙනෙන නිසා, ඒ වෙනුවට නැවත සැකසීම නෝඩ්ලිස්ට් ගුණාංග හරහා පමණි.

තනි ප්‍රති result ලයකදී, මට ලැබුණේ:

var nodes = document.querySelectorAll(selector);
nodes
 NodeList [a._19eb]
for (node in nodes) {console.log(node)};
VM505:1 0
VM505:1 length
VM505:1 item
VM505:1 entries
VM505:1 forEach
VM505:1 keys
VM505:1 values

එය මා for (node in nodes) node.href = newLink;අසමත් වීමට හේතුව පැහැදිලි කළේය.

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.