反復可能なオブジェクトに対してより強力なチェックを提供し、制御構造を削減することです。
以下のコードを使用して、null の初期チェックを取り除くように修正しました。キーを使用して何かを明示的にチェックすることにより、何かがすり抜けない ( obj == null ) という一見より強力な保証を提供でき、4 つの制御ステートメントのうちの 1 つを削除できます。更新はスニペット 2 にあります。
また、チェックを追加することで、&& obj
エラーがスローされるのを回避できます。これは、元のチェックの目的のようです。
obj == null
と を検出undefined
しnull
ます。
アンダースコアから:
スニペット1
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
新しいスニペット。コメントの直後の行が変更されています。
スニペット 2a
var each = _.each = _.forEach = function(obj, iterator, context) {
// modify - obj &&
if (nativeForEach && obj && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
// modify - obj &&
} else if (obj && (obj.length === +obj.length)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
3 つのケースのうち 0 つが一致した場合return undefined
、デフォルトで、つまり暗黙的に失敗します。
この削除は正しく機能しますか?
ディスカッションごと:
スニペット 2b
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj && (obj.length === +obj.length)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};