Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why for..of does not see non-numeric array indexes?

Say, I have array with non-numeric indexes:

let arr = [12]
arr["fruit"] = "apple"
arr["off"] = false

1. for..of does not see non-numeric indexes:

for (let item of arr) {
  console.log(item)
}

• Output:

12

2. Iterator does not see non-numeric indexes either:

let iterator = arr[Symbol.iterator]()
let { value, done } = iterator.next()

while (!done) {
  console.log(value);
  ({ value, done } = iterator.next())
}

• Output:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

12

However:

3. Object.keys() does see non-numeric indexes:

for (let key of Object.keys(arr)) {
  console.log(`key: ${key}`)
}

• Output:

key: 0
key: fruit
key: off

4. Object.values() sees values of all indexes:

for (let value of Object.values(arr)) {
  console.log(`value: ${value}`)
}

• Output:

value: 12
value: apple
value: false

5. Object.entries() sees all entries:

for (let [key, value] of Object.entries(arr)) {
  console.log(`key = ${key}, value = ${value}`)
}

• Output:

key = 0, value = 12
key = fruit, value = apple  
key = off, value = false  

6. Object.getOwnPropertyNames() also sees all non-numeric indexes:

for (let prop of Object.getOwnPropertyNames(arr)) {
  console.log(prop)
}

• Output:

0
length
fruit
off

7. These non-numeric indexes are enumerable:

let descr

descr = Object.getOwnPropertyDescriptor(arr, "fruit")
console.log(descr)

descr = Object.getOwnPropertyDescriptor(arr, "off")
console.log(descr)

• Output

{
  value: 'apple',   
  writable: true,   
  enumerable: true, 
  configurable: true
}

{
  value: false,   
  writable: true,   
  enumerable: true, 
  configurable: true
}

>Solution :

When you use what you are describing as "non-numeric" indexes with an Array, you are mistaken as to what you are doing.

let arr = [12];     // Create an array with that holds an array with only the number 12 in it
arr["fruit"] = "apple";  // Add a new custom property to your instance of an Array
arr["off"] = false       // Add a new custom property to your instance of an Array

console.log(arr[0]);        // 12
console.log(arr["fruit"]);  // "apple"
console.log(arr["off"]);    // false
console.log(arr.length)     // There is only 1 array item, but 2 additional properties

Arrays only have numeric indexes, but they are objects so they also have properties. For example the Array.length property isn’t something that shows up when you loop over the indexes.

So when you say: "Object.getOwnPropertyNames() also sees all non-numeric indexes", well, no, it doesn’t. As the method name states, it gets all the property names that have been added to that unique instance of the object, not indexes. Index != Property.

If you want names to go with the values, you need to use Object, which has "keys", which can be any string value at all.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading