JS.next

JavaScriptの最新実装情報を追うブログ

ArrayIteratorがインデックスを数値型で返すようになった

変更点

タイトルの通り



影響

一部のArrayIteratorを返すメソッド

  • Array.prototype.keys
  • Array.prototype.entries


概要

先日規格の仕様変更があり、V8もそれに追従した。
これ自体は小さな変更だけど、ArrayIteratorがfor-inループと同じ感じだと思っていると詰まるかも。


以下、Array.prototype.keysでの例を挙げてみる。

var i
var A = [ 'a', 'b', 'c' ]


// 変更前
for (i of A.keys()) console.log(i)  // "0" "1" "2"
typeof i                            // "string" 

// 変更後
for (i of A.keys()) console.log(i)  // 0 1 2
typeof i                            // "number"

// for-in
for (i in A) console.log(i)         // "0" "1" "2"
typeof i                            // "string"

ただのfor-inループでのキー列挙との更なる違い

var i
var A = [ 'a', 'b', 'c' ]

Array.prototype.x = 'xxx'


// for-in
for (i in A) console.log(i)         // "0" "1" "2" "x"

// for-of + Array.prototype.keys
for (i of A.keys()) console.log(i)  // 0 1 2

for-inはプロトタイプを辿ってキーを探す、ArrayIteratorは辿らない。


オマケ

以上の性質より、よくあるforループをこう書くこともできる。

for (i = 0; i < A.length; ++i) {
}

for (i of A.keys()) {
}


実装バージョン

V8 3.20.14