5

I'm writing a simple for...in loop in javascript, and wondering why the key is a string and not a number?

Why is it so, and can I change that to be a number?

var array = ["a", "b", "c"];

for (var key in array) {
   console.log(typeof key); //string
   console.log(key + 1); //expected output : 01, 11, 21...
}
2
  • It's probably because for y in x treats the x as an object so you can iterate through its properties Commented Jan 28, 2019 at 11:47
  • Using a foreach with arrays is a bit expensive if you want to access array elements as you'd have to parse key on to an int, is best to use foreach loops for objects ({}) and not arrays ([]). The standard loops for arrays are either for(let i=..; i < ....; i++) {} or array.forEach(function(val, i) { }). Commented Jan 28, 2019 at 11:53

3 Answers 3

9

It's a string because standard arrays in JavaScript aren't really arrays at all¹, they're objects with properties for the array entries, and object property names (keys) are strings, Symbols, or (soonish) private names.

You can't make it a number by default in a for-in, but you can convert it to a number, or use other forms such as a standard for or a forEach call:

for (var key = 0; key < array.length; ++k) {
    // ...
}
// ..or
array.forEach((entry, key) => {
    // ...
});

Using for-in to loop through an array is almost always an anti-pattern. See my answer here for a thorough rundown of your various options for looping through arrays.


¹ That's a post on my anemic little blog.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the quick answer, and nice little explanation on your blog :).
3

Objects and properties

Please note that all keys in the square bracket notation are converted to String type, since objects in JavaScript can only have String type as key type.

1 Comment

That hasn't been true for years. ES2015 introduced Symbol-named properties, and ES2019 or ES2020 will introduce private names as well. I've fixed the quote above in the linked article.
2

Object property names are always strings.

Use +, parseInt, JSON.parse or any other standard method to convert a string to a number if you want a number.

var array = ["a", "b", "c"];

for (var key in array) {
  console.log(+key + 1);
}

1 Comment

"Object property names are always strings." That hasn't been true for years... :-)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.