📝

[Javascript] IteratorによるforEachは一部未サポート

に公開1

背景

とある案件で一部ブラウザではサポートされていないメソッドを使用していたことによって、実装した機能のリリース後に未サポートのブラウザを使用している一部のユーザーでエラーが発生してしまうことがありました。

このような例は度々あることかと思いますが、今回はIteratorによるforEachを使用したことで発生した際の記事になります。

forEachの種類

まず前提として、forEachメソッドにはいくつか種類が存在します。
今回取り扱うのは使われることが多そうな「Array」「Map」「Iterator」に対して使用するforEachになります。
他にも種類はあるので、気になる方は以下のリファレンスから調べてみてください。

Array.prototype.forEach()

最もよく使われるであろう配列に対して使用するforEachメソッドで、
第一引数から配列の要素、第二引数からインデックスを取得できます。

const array = ["a", "b", "c"];
array.forEach((value, index) => {
    console.log(value);
    console.log(index);
});

// 出力結果
> "a"
> 0
> "b"
> 1
> "c"
> 2

こちらのメソッドはFull supportされています。
ブラウザの互換性

Map.prototype.forEach()

Mapに対して使用するforEachメソッドで、
第一引数からMapの要素、第二引数からキーを取得できます。

const map = new Map([
  ["key1", 1],
  ["key2", "string"],
  ["key3", {}],
]);
map.forEach((value, key) => {
    console.log(`key: ${key}, value: ${value}`);
});

// 出力結果
> "key: key1, value: 1"
> "key: key2, value: string"
> "key: key3, value: [object Object]"

こちらのメソッドはFull supportされています。
ブラウザの互換性

Iterator.prototype.forEach()

Iteratorに対して使用するforEachメソッドで、
第一引数からIteratorの要素、第二引数からインデックスを取得できます。

const iterator = new Set(["a", "b", "c"]).values();
iterator.forEach((value, index) => {
    console.log(value);
    console.log(index);
});

// 出力結果
> "a"
> 0
> "b"
> 1
> "c"
> 2

ブラウザの互換性

Iterator.prototype.forEach()の回避方法

未サポートによるエラーが発生した際の使用例としては、
以下のようなMap型のkeyを使用しようとした処理で実装されていました。

// Map.keys()とするとIteratorになるため、未サポートのforEachを使用する実装になっていた
Map.keys().forEach(key => {// 実行したい処理});

このような場合にIteratorでforEachを回避する方法の紹介です。
※他にも良い方法があればコメントで教えていただけると幸いです。

  1. for文を使う
for (let key of Map.keys()) {
// 実行したい処理
};
  1. Map.prototype.forEach()を使う
Map.forEach(((value,key) => {
// 実行したい処理
});
ファースト・スクラッチTech Blog

Discussion

junerjuner

そもそも Iterator helper の基点メソッドの Iterator.from 自体が Safari 対応 18.3 時点ではまだなので……

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Iterator

※見ての通り 18.4 ではサポートしている

https://developer.apple.com/documentation/safari-release-notes/safari-18_4-release-notes#JavaScript

というか今日リリースされましたね。 Safari 18.4

https://forest.watch.impress.co.jp/docs/news/2002211.html

1