はじめに
jQueryの$.eachは、一般的なforeachと異なり以下の特徴があります。
①break・continueは使えない
②return falseをすることでbreak相当を、returnもしくはreturn trueをすることでcontinue相当をすることができる
コード例としては公式のドキュメントを参照のこと。ドキュメントにはcontinue相当の例はないですが、false以外にしてif以降に処理を書くとcontinue相当の動きをすることがわかります。
この記事では、①・②が何故なのかを確認します。自分はreturn trueとreturn falseのどっちがbreakでどっちがcontinueなんだ?といつも迷ってググっているので、特に②についてどっちがどっちなのかを理解できることを目指します。
jQueryのソースコードを確認
というわけでjQueryのeachのソースコードを探したら以下にありました。
以下該当部分の抜き出しです。
each: function( obj, callback ) {
var length, i = 0;
if ( isArrayLike( obj ) ) {
length = obj.length;
for ( ; i < length; i++ ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
} else {
for ( i in obj ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
}
return obj;
},
①については、各要素に対しての処理を書いている部分はcallbackというfunctionであり、break・continueが使えるforEachの中身の記述ではないということがわかります。
②については、そのcallbackの戻り値がfalseの時のみbreakし、それ以外の時は次のループを実施するという実装になっているからということがわかりました。
おまけ ほかの言語(C#(.Net))との比較
以前の記事で同じような内容をC#について書いています。
break・continueが使えない理由については同じ理由だろうというのは察しがついていて実際同じだったのですが、戻り値のtrue/falseでbreak・continue相当のことができるのは相違点なので見比べると面白いです。