Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Iterator in a loop is a 'string' instead of 'number' #39089

Closed
andrewgwallace opened this issue Jun 19, 2021 · 5 comments
Closed

Iterator in a loop is a 'string' instead of 'number' #39089

andrewgwallace opened this issue Jun 19, 2021 · 5 comments

Comments

@andrewgwallace
Copy link

andrewgwallace commented Jun 19, 2021

Version: v12.16.1, v15.14.0 (tested)
Platform(s) (tested):

  • Linux 7b473cfe85f6 5.8.0-1032-gcp fix LICENSE #34~20.04.1-Ubuntu SMP Wed May 19 18:19:35 UTC 2021 x86_64 GNU/Linux
  • Darwin Kernel Version 20.5.0

What steps will reproduce the bug?

Create test array and console log out the typeof of the iterator to see the result

Sample snippet:

const movies = [
  { 
    title: 'Requiem for a Dream',
    duration: 128
  }
]

function iteratorType(array) {
  for (let i in array) {
    console.log(typeof i)
  }
}

iteratorType(movies)

How often does it reproduce? Is there a required condition?

Every time. Conditions: An array with at least one value.

What is the expected behavior?

The iterator should be typeof number.

What do you see instead?

A typeof of 'string' is returned

@andrewgwallace
Copy link
Author

I guess I'm probably missing some logical reason as to why an iterator is a string but it just seems odd -- When I was writing up a quick sort algorithm, I had to do parseInt(i) in order to make the comparison operator work with the index of the item I was comparing it to. Seems like an unnecessary step.

@Trott
Copy link
Member

Trott commented Jun 19, 2021

This is the way JavaScript works and Node.js can't realistically change it. You will get the same result running your code in a browser.

for...in is not recommended for Arrays generally. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in for explanation, references, and alternatives.

@mscdex
Copy link
Contributor

mscdex commented Jun 19, 2021

Option 1: If you don't want to create a new data structure from the existing data, you'll have to use a vanilla for loop (this is the simplest and fastest approach).

Option 2: You can instead iterate over both the keys and values using movies.entries() instead of just movies and using for-of. Doing so will get you a number type for the index:

const movies = [
  { 
    title: 'Requiem for a Dream',
    duration: 128
  }
]

function iteratorType(array) {
  for (let [i, val] of array.entries()) {
    console.log(typeof i)
  }
}

iteratorType(movies)

This option can be handy if you also need the value.

@Trott
Copy link
Member

Trott commented Jun 19, 2021

I'm going to close this because there isn't anything we're likely to do to change this behavior. But feel free to leave additional comments/questions if we've missed something.

@Trott Trott closed this as completed Jun 19, 2021
@andrewgwallace
Copy link
Author

Thank you all for the valuable feedback! ☺️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants