この記事は
Nodejs:V8.9.1
で検証した結果をもとに書いています
javascriptのArrayには連想配列的な添字を充てる事ができます。
var arr = new Array(1, 2, 3);
arr['text1'] = 'test';
この時点でのarr
オブジェクトは以下の様になります。
t.log(arr.length);
// ℹ 3
t.log(Object.keys(arr));
// ℹ ['0','1','2','text1',]
t.log(arr instanceof Array);
// ℹ true
t.log(arr);
/* ℹ [
1,
2,
3,
---
text1: 'test',
]
*/
このオブジェクトでイテレートした時にどのような挙動になるのか調べてみます。
forEach
arr.forEach(function(s, i) {
t.log(i, s);
});
/// result
ℹ 0 1
ℹ 1 2
ℹ 2 3
arr.text1
は無視されています。
for
for (j = 0, len = arr.length; j < len; j++) {
s = arr[j];
t.log(`for: ${s}`);
}
/// result
ℹ for: 1
ℹ for: 2
ℹ for: 3
やはりarr.text1
は無視されています。というよりもarr.length
は3
なのでイテレートされるはずがありません。
for in
for (key in arr) {
value = arr[key];
t.log(`for in {${key}: ${value}}`);
}
///
ℹ for in {0: 1}
ℹ for in {1: 2}
ℹ for in {2: 3}
ℹ for in {text1: test}
arr.text1
がイテレートされています。
そもそもこの挙動が公式に認められてるモノなのか、いつかシレっとなくなってしまうものなのかわかりません。
便利だから使いたいんだけどええんやろか。。。