Jack_of_All_Trades
Jack_of_All_Trades

Reputation: 11468

while(i--) loop in javascript

I normally use while loop as:

while (i<some_value) 

I saw while(i--) syntax and thought it is shorter and cooler and tried the following in google-chrome.

var num_arr= [4,8,7,1,3];


var length_of_num_arr=num_arr.length;


while(length_of_num_arr--) console.log(num_arr);
 [4, 8, 7, 1, 3]
 [4, 8, 7, 1, 3]
 [4, 8, 7, 1, 3]
 [4, 8, 7, 1, 3]
 [4, 8, 7, 1, 3] **// THIS IS EXPECTED RESULT**

But When I try...

while((num_arr.length)--) console.log(num_arr);
[4, 8, 7, 1]
[4, 8, 7]
[4, 8]
[4]
[] // WHY IS THIS HAPPENING??

Is there some hidden things you need to understand to use this syntax?

Upvotes: 1

Views: 104

Answers (3)

TaoPR
TaoPR

Reputation: 6052

When you do array.length-- you're potentially shortening the array by one element each time.

See the reference under the section Shortening the array from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length

Array.prototype.length can be re-written programmatically and it potentially shorten your array by the new length you assign.

For example

a = [1,2,3,4,5,6,7,8,9,10];

// Shorten the array by one element
a.length--; // a <-- [1,2,3,4,5,6,7,8,9]

// In case you want to shorten your array to 3 elements, you can:
a.length = 3; // a <-- [1,2,3]

Upvotes: 2

Oriol
Oriol

Reputation: 288130

When you set the length property of an array to a lower value, the items at the end are removed:

var arr = [1,2,3,4,5];
arr.length; // 5
arr.length = 3;
arr; // [1,2,3]

This is described in the spec:

While newLen < oldLen repeat,

  1. Set oldLen to oldLen – 1.
  2. Let deleteSucceeded be the result of calling the [[Delete]] internal method of A passing ToString(oldLen) and false as arguments.

In your code you use the postfix decrement operator (--) which reduces the length of the array.

Upvotes: 1

Ry-
Ry-

Reputation: 224922

Arrays’ length property is writable, and will cut off their elements or add empty slots as appropriate when you set it.

var items = [1, 2, 3, 4, 5];
items.length = 3; // items is now [1, 2, 3]
items.length = 6; // items is now a sparse array: [1, 2, 3, undefined × 3]

So, don’t do that.

Upvotes: 8

Related Questions