2015-11-20 2 views
0

Хороший Javascript программист хорошо знает этот тест:Создать JavaScript «HasValue» Util метод

if (typeof(dummy) != 'undefined' && dummy != null && dummy != '') { 
    // Do stuffs 
} 

На самом деле этот тест убедитесь, что фиктивная переменная имеет значение. Поэтому я попытался написать эту функцию. Мои тесты случаи:

hasValue(undefined) => should returns false 
hasValue(null) => should returns false 
hasValue('') => should returns false 
hasValue(' ') => should returns true 
hasValue([]) => should returns false 
hasValue({}) => should returns false 
hasValue(true) => should returns true 
hasValue(false) => should returns true 
hasValue(0) => should returns true 
hasValue(new Date()) => returns false, but should returns true ? 

Вот функция:

function hasValue (v) { 
    if (typeof v === 'object') { 
    for (key in v) { 
     if (v.hasOwnProperty(key)) { 
     return true; 
     } 
    } 
    return false; 
    } 
    if (v === false) { 
    return true; 
    } 
    if (v === 0) { 
    return true; 
    } 
    return (typeof(v) != 'undefined' && v != null && v != ''); 
} 

Кто-нибудь увидеть что-то не так, или какой-либо оптимизации, или, может быть, я забыл Somes случаи?

+3

Возможно, вы хотите опубликовать это на [Обзор кода] (http://codereview.stackexchange.com/). – JCOC611

+1

Это все «значения» кстати. Может быть, вы ищете «непустые» значения для некоторого определения «пустой»? Также обратите внимание, что 'typeof' не является функцией. –

+1

Вы считали особые константы, такие как NaN? –

ответ

0

Не так много, но некоторые сокращения кода, где ваш тестируют для объекта

if (typeof v === 'object') { 
    return Object.keys(v).length > 0; 
} 
+0

Спасибо. Но знаете ли вы, работает ли это в IE8? – wawawoom

+0

О, Боже, помогите нам избавиться от IE: D –

+0

Я знаю, но некоторые из моих клиентов используют IE8. Печально, но это правда. – wawawoom

2

Это ужасный способ Util. Вы засучив следующие решения в одну функцию:

  • Хотите [] означает «пользователь не выбрал никаких опций, переспрашивать» или «пользователь не выбрал никаких вариантов, по-прежнему»?
  • Вы хотите, чтобы {} означало «никакие параметры не переданы функции» или {} означает «параметры, не переданные функции, используйте параметры по умолчанию»?
  • Вы хотите, чтобы ' ' был действительным пользователем для среднего имени, но '' недействительным?
  • Вы хотите, чтобы 0 был действительным идентификатором пользователя, даже если ваша база данных возвращает его, что означает, что нет идентификатора пользователя?

Логика зависит от домена. Если вы программируете, скажем, панель пользовательских параметров, вы можете реализовать UserDashboard.hasValue, который вернет false для [], а остальное, как указано, но это зависящая от домена логика, а не некоторые общие символы underscore.js или jQuery или node.js функция полезности модуля.

Даже тогда это было бы беспорядок для чтения. Если я вижу линию

if(hasValue(v)) { 
    ... 
} 

я теперь должен прочитать тайную логику в hasValue, чтобы выяснить, какие возможные комбинации значений falsey, [], {} и ' 'вы разрешаете и запрещая. Если вам просто нужно проверить, что v не null напишите код, чтобы сделать это.

Существуют методы на разных языках, как isNullOrEmpty, который является метод полезности, как Вы сказали, только его название говорит вам точно то, что она делает, и он не пытается сделать все. Вероятно, он имеет более подробное имя, чем вы думаете. Это верно; он должен, или же неясно, что он на самом деле делает.

+0

Точно. Единственный «hasValue», который хорош, тот, который проверяет «undefined» и «null», и даже там я бы избегал глобальной функции. – Sulthan

+0

Итак, может быть, метод должен быть назван isEmpty? а затем изменить код? или isNotEmpty(), может быть, легче понять, что должен вернуть метод ... – wawawoom

+0

@wawawoom idk '' '' действительно пуст? Это строка одного символа, поэтому она не пуста с этой точки зрения. Как насчет пустой строки? Это не массив, поэтому он может * не * быть пустым, поэтому, возможно, этот метод должен возвращать false. В любом случае вы просто заставили меня прочитать реализацию функции * каждый раз, когда я ее использую, а не облегчая жизнь. – djechlin

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