2013-07-02 2 views
2

Это должно было обеспечить более надежную проверку итерационных объектов и уменьшить структуру управления.Можно ли удалить здесь null для удаления?

Я принял приведенный ниже код и изменил его, чтобы избавиться от первоначальной проверки для null. Явным образом проверяя что-то с помощью ключей, мы можем обеспечить, казалось бы, более сильную гарантию того, что что-то не будет проскальзывать (obj == null), и мы можем исключить 1 из 4 управляющих операторов. Обновление находится в фрагменте 2.

Кроме того, добавив в чек на && obj, мы можем избежать ошибок, возникающих, что, по-видимому, было для первоначальной проверки.

obj == null обнаружит undefined и null.

От Underscore:

Snippet1

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; 
     } 
     } 
    } 
    }; 

Если 0 из 3-х случаях совпадают, он провалится и return undefined по умолчанию, то есть, в неявном виде.

Будет ли это правильно работать?

Per обсуждения:

Snippet 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; 
     } 
     } 
    } 
    }; 
+0

В чем проблема с первым фрагментом? Использование защитных условий - хорошая практика. –

+0

Что вы подразумеваете под «* Явным образом проверяю что-то с ключами»? – Bergi

ответ

0

мы можем исключить 1 из утверждений 4 управления

... но вам придется добавить эти obj && проверки в другие, и вам даже нужно ввести другое if-условие вокруг цикла объекта. Вы делаете код более сложным и медленным с этим «улучшением».

Будет ли это правильно работать?

Ну, вы изменили поток управления. Если вы переходите в массивы или другие объекты, нет изменений в поведении, но ваш новый фрагмент не будет перечислять логические значения и числа (например, here), а не пытаться итерации пустых строк. Не уверен, что вы считаете «правильным».

+0

невозможно перечислить число или логическое значение с помощью 'for-in' ... http: //jsfiddle.net/Uxnqq/2 ... –

+0

@ pure_code.mom: невозможно присвоить свойства примитивным значениям , это верно. Но вы все равно можете использовать их в in-in-перечислениях, где они неявно отображаются на объекты: http: // jsfiddle.net/Uxnqq/3/- пожалуйста, измените ваш downvote на upvote :-) Я не говорю, что это актуально, конечно, я просто хотел показать, что есть крошечная разница. – Bergi

+0

Я ничего не изменил, просто добавил демонстрационную ссылку. И первая часть ответа (о «* создании кода более сложной и медленной») остается в силе. Если вы уточните свой вопрос о «правильности» (измените его на * Оказывает ли он то же самое на массивах и объектах? * Или что-то в этом роде), я с удовольствием адаптирую свой ответ. – Bergi

Смежные вопросы