Как я могу проверить наличие пустой / неопределенной / пустой строки в JavaScript?

2853

Я видел этот вопрос , но я не видел конкретного примера JavaScript. Есть ли простое string.Emptyв JavaScript или это просто проверка ""?

casademora
источник
2
только к вашему сведению, я думаю, что самые полезные API для класса String находятся в Mozilla и javascript kit . [elated.com] ( elated.com/articles/working-with-strings ) содержит учебник по всем свойствам, методам String, ... Обратите внимание: ссылка на Mozilla обновлена ​​до developer.mozilla.org/en/ JavaScript / Справочник / Global_Objects /…
Gene T
Проверьте это: stackoverflow.com/a/36491147/7026966
Химаншу Шекхар
Это очень помогло бы, если бы требование было четко указано. Для каких значений isEmpty должен возвращать true? Проверка на "" подразумевает, что он должен возвращать истину только в том случае, если значением является тип string и длина 0. Многие ответы здесь предполагают, что он также должен возвращать истину для некоторых или всех значений Falsey.
RobG

Ответы:

3574

Если вы просто хотите проверить, есть ли какое-либо значение, вы можете сделать

if (strValue) {
    //do something
}

Если вам нужно проверить специально для пустой строки над нулем, я думаю , что проверка против ""является лучшим выбором, используя в ===оператора (так что вы знаете , что это, на самом деле, строку вы сравниваете против).

if (strValue === "") {
    //...
}
bdukes
источник
174
Тестирование свойства length на самом деле может быть быстрее, чем проверка строки на "", потому что интерпретатору не нужно будет создавать объект String из строкового литерала.
Винсент Роберт
26
@ Vincent выполнил наивное профилирование в инструментах разработчика Chrome, тестирование === ''и тестирование .lengthне показали заметного улучшения (и использование .lengthтолько работ, если можно предположить, что у вас есть строка)
bdukes,
26
@bdukes, когда вы начинаете заботиться о такого рода микрооптимизациях, я не думаю, что Chrome - это браузер, в котором у вас больше всего проблем с производительностью ...
Винсент Роберт,
15
Просто отметим, что если ваше определение «пустой строки» включает пробелы, то это решение не подходит. Строка из 1 или более пробелов возвращает true выше. Если вы используете JQuery, вы можете просто использовать это: if ($ .trim (ref) .length === 0) - согласно этому ответу на аналогичный вопрос: stackoverflow.com/questions/2031085/…
CodeClimber
115
Как и ожидалось, .length > 0на самом деле намного быстрее, чем сравнение со строковым литералом! Проверьте это jsPerf
Чад
1128

Для проверки, является ли строка пустой, нулевой или неопределенной, я использую:

function isEmpty(str) {
    return (!str || 0 === str.length);
}

Для проверки, является ли строка пустой, нулевой или неопределенной, я использую:

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}

Для проверки, является ли строка пустой или содержит только пробел:

String.prototype.isEmpty = function() {
    return (this.length === 0 || !this.trim());
};
Яно Гонсалес
источник
21
почему 0 === str.length вместо str.length === 0?
Винсент
66
@ Vincent Условия часто пишутся так, if (variable == constant value)и если вы забудете '=', вы назначаете постоянное значение переменной вместо тестирования. Код все равно будет работать, так как вы можете назначить переменную в if. Поэтому более безопасный способ написать это условие - поменять местами постоянное значение и переменную. Таким образом, когда вы тестируете свой код, вы увидите ошибку (неверная левосторонняя сторона в назначении). Вы также можете использовать что-то вроде JSHint, чтобы запретить присваивание в условиях и получать предупреждения при его написании.
Флориан
2
позор, который на /^\s*$/.test(str)самом деле не читается - может быть, лучше удалить пробелы, используя более простой код или регулярное выражение? см. stackoverflow.com/questions/6623231/…, а также stackoverflow.com/questions/10800355/…
Adrien Be
6
/^\s*$/.test(str) можно заменить на str.trim (). length === 0
Schadenfreude
21
@Vincent это также называется "Условия Йоды", как if blue is the sky. См. Dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
AZ.
316

Все предыдущие ответы хороши, но это будет еще лучше. Используйте !!( не не ) оператор.

if(!!str){
    // Some code here
}

Или используйте тип литья:

if(Boolean(str)){
    // Code here
}

Оба выполняют одну и ту же функцию. Введите переменную в логическое значение, где strпеременная.
Это возвращается falseдля null,undefined,0,000,"",false.
Возвращается trueдля строки "0" и пробела "".

karthick.sk
источник
61
Почему это «еще лучше»?
Мен
33
Есть ли разница между поведением if(str)и if(!!str)?
Питер Олсон
6
@PeterOlson, если вы пытаетесь сохранить переменную как логическое значение, которое проверяет содержание на наличие нескольких строк, тогда вы захотите сделать это .. иначе, var any = (!!str1 && !!str2 && !!str3)если там тоже есть число
Джон Рудделл
23
Это решение, которое я всегда использую. !!str.trim()чтобы убедиться, что строка состоит не только из пробелов.
Дарио Одендино,
5
Не выглядит как взломанный, Boolean(str)гораздо более читабелен и менее «весит».
Shinzou
106

Самое близкое, что вы можете получить str.Empty(с условием, что str является String):

if (!str.length) { ...
Атес Горал
источник
9
Разве это не сгенерирует исключение, если str равен нулю?
Pic Mickael
3
@PicMickael Да! Так бы str.Empty.
Атес Горал
99

Если вам нужно убедиться, что строка - это не просто набор пустых пробелов (я предполагаю, что это для проверки формы), вам нужно заменить эти пробелы.

if(str.replace(/\s/g,"") == ""){
}
Sugendran
источник
8
Но выполняет работу, если то, что вы действительно хотите проверить, это строка с непробельным содержимым. Есть ли менее дорогой способ проверить это?
вспышка
4
Как насчет свойства длины?
2010 года
27
Вместо того, чтобы удалить все пробелы, почему бы просто не проверить, есть ли не пробел? Имеет 2 преимущества, которые он может выручить рано, если есть непробельный символ, и у него нет возврата новой строки, с которой вы потом проверяете. if(str.match(/\S/g)){}
mpen
34
@ Отметьте, к вашему сведению, вам не понадобится глобальный модификатор, поскольку совпадение с первым вхождением str.match(/\S/)
непробельного
1
почему это дорого? Если это действительно так, то почему jQuery использует этот метод? Вы можете найти это в источнике jQueryvar trimLeft = /^\s+/, trimRight = /\s+$/;
Marecky
66

Я использую:

function empty(e) {
  switch (e) {
    case "":
    case 0:
    case "0":
    case null:
    case false:
    case typeof(e) == "undefined":
      return true;
    default:
      return false;
  }
}

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
})) // false
форсунка
источник
5
Это решение не зависит от языка. Единственная функция JavaScript, на которую он опирается - это typeof. Так что это хороший пример решения, которое вы можете использовать, когда вы не доверяете реализациям в разных браузерах и у вас нет времени, чтобы найти лучшее решение. (Т.е. нет доступа в интернет). Это что-то вроде доказательства. Не самый чистый, но вы можете быть уверены, что он будет работать, не зная слишком много о JavaScript.
Джефф Дэвис,
2
Я бы пошел еще дальше и прибил оператором === для неопределенного случая. В противном случае это просто идеальный ответ.
xarlymg89
typeofВ switchне работает для меня. Я добавил if (typeof e == "undefined")тест, и это работает. Почему?
Лукас
1
@Lucas Потому что это была опечатка или недосмотр. Ваша модификация - правильный подход. (оригинал относится к контексту пустой функции, а не к параметру e, который должен проверять функция)
beeThree
Можем ли мы использовать case undefined:вместо case typeof(e) == "undefined":?
Борис Дж.
43

Вы можете использовать lodash : _.isEmpty (value).

Она охватывает много случаев , как {}, '', null, undefinedи т.д.

Но он всегда возвращается trueдля Numberтипа примитивных типов данных JavaScript, таких как _.isEmpty(10)или _.isEmpty(Number.MAX_VALUE)оба true.

Moshii
источник
_.isEmpty(" "); // => false
Эрих
1
@Erich Потому " "что не пусто. _.isEmpty("");возвращает истину.
Моши
1
Совершенно верно - я упоминал об этом, потому что некоторые другие ответы здесь подразумевают проверку формы и проверку, состоит ли строка только из пробела, и эта единственная функция lodash сама по себе не решит эту проблему.
Эрих
@ Эрих, теперь я понял, спасибо, что упомянул.
Моши
36

Пытаться:

if (str && str.trim().length) {  
    //...
}
Ян Донг
источник
2
Требуется ли свойство длины?
frogcoder
str.trim().lengthбудет быстрее, чем str.trim(), примерно на 1% в соответствии с моими собственными результатами тестирования.
devildelta
2
@devildelta - Ваш 1% является ошибкой в ​​вашем тесте.
Стивен М Ирвинг
OP ищет тест на наличие пустой строки, неопределенного или нулевого. Это тестирование для строки, которая не является ни одним из этих условий. Он ничего не сказал о пробелах, только о строках. Вы можете проверить условия OP только с этим, если вы уверены, что никакие другие типы данных не сохранены в переменной: if (!str) { ... }
Стивен М Ирвинг
36

Функция:

function is_empty(x)
{
    return (
        (typeof x == 'undefined')
                    ||
        (x == null)
                    ||
        (x == false)  //same as: !x
                    ||
        (x.length == 0)
                    ||
        (x == "")
                    ||
        (x.replace(/\s/g,"") == "")
                    ||
        (!/[^\s]/.test(x))
                    ||
        (/^\s*$/.test(x))
    );
}

PS: в JavaScript не используйте разрыв строки после return;

T.Todua
источник
1
Есть ли шанс, что вы могли бы объяснить, что делает каждая проверка? :)
DanV
2
-1 Они проверяют разные вещи. Нет смысла объединять их все в одно ifутверждение.
Беннет МакЭлви
1
typeof MyVariable == 'undefined' не различает инициализированную переменную с неопределенным значением и необъявленную переменную, если переменная не была первоначально объявлена ​​и инициализирована нулевым значением. Проверка свойства length приводит к тому, что строковый примитив оборачивается строковым объектом.
Скотт Маркус
34
var s; // undefined
var s = ""; // ""
s.length // 0

Там нет ничего, представляющего пустую строку в JavaScript. Выполните проверку либо length(если вы знаете, что var всегда будет строкой), либо против""

cllpse
источник
29

Я бы не стал слишком беспокоиться о самом эффективном методе. Используйте то, что наиболее ясно для вашего намерения. Для меня это обычно strVar == "".

Согласно комментарию Константина , если бы strVar мог каким-то образом содержать целочисленное значение 0, то это действительно была бы одна из тех ситуаций, проясняющих намерения.

Крис Но
источник
11
Плохая идея. Вы получите правду, если strVar случайно назначен 0.
Константин
5
Я согласен с тем, что разъяснение вашего намерения более важно, чем любые микрооптимизации, которые могут принести другие методы, но лучше использовать оператор строгого сравнения === . Возвращает true только если strVarэто пустая строка.
бесполезный код
Проверка не пройдена, если она не определена. Так что, если (ул) работает лучше
Валентин Хайниц
3
@ValentinHeinitz, если str присвоено значение Falsey 0 или «0», если (str) будет ложно сообщать об истине. Лучший подход - если (str === ""). Это просто и никогда не подведет.
Скотт Маркус
21

Представление

Я выполняю тесты на macOS v10.13.6 (High Sierra) для 18 выбранных решений. Решения работают немного иначе (для входных данных углового случая), которые были представлены во фрагменте ниже.

Выводы

  • простые решения , основанные на !str, ==, ===и lengthбыстро для всех браузеров (А, В, С, G, I, J)
  • решения, основанные на регулярном выражении ( test, replace) и charAtсамые медленные для всех браузеров (H, L, M, P)
  • решения, помеченные как самые быстрые, были самыми быстрыми только за один запуск теста, но во многих случаях они изменяются в группе «быстрых» решений

Введите описание изображения здесь

подробности

В следующем фрагменте я сравниваю результаты выбранных 18 методов, используя разные входные параметры

  • "" "a" " "- пустая строка, строка с буквой и строка с пробелом
  • [] {} f- массив, объект и функция
  • 0 1 NaN Infinity - номера
  • true false - логическое значение
  • null undefined

Не все протестированные методы поддерживают все входные данные.

И затем для всех методов я выполняю тест скорости str = ""для браузеров Chrome v78.0.0, Safari v13.0.4 и Firefox v71.0.0 - вы можете запустить тесты на своей машине здесь

Введите описание изображения здесь

Камил Келчевски
источник
Это действительно круто! Я люблю видеть все это выложенным! Спасибо!
WebWanderer
это тщательное исследование - спасибо
Деян
20

Много ответов и много разных возможностей!

Без сомнения, для быстрой и простой реализации победителем является: if (!str.length) {...}

Тем не менее, как и многие другие примеры доступны. Лучший функциональный метод для этого, я бы предложил:

function empty(str)
{
    if (typeof str == 'undefined' || !str || str.length === 0 || str === "" || !/[^\s]/.test(str) || /^\s*$/.test(str) || str.replace(/\s/g,"") === "")
    {
        return true;
    }
    else
    {
        return false;
    }
}

Я немного излишне знаю.

TFont
источник
2
Проверка на неопределенные должна быть перемещена в первую очередь в проверках, иначе неопределенные элементы вызовут исключения в предыдущих проверках.
SvdSinner
Полностью согласен! ХОРОШО ПОЙМАЛ. Я отредактирую свой ответ выше!
tfont
str.length === 0возвращает true для любой функции, которая не имеет формальных параметров.
RobG
20

Вы также можете использовать регулярные выражения:

if((/^\s*$/).test(str)) { }

Проверяет строки, которые либо пусты, либо заполнены пробелами.

ОЙ
источник
Это работает, но это также ужасно дорого. Хорошо, если вы просто хотите проверить одну или две вещи, а не большой набор.
Орфей
19
  1. проверить, что var a;существуют
  2. обрезать false spacesзначение, затем проверитьemptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }
Тимоти Нванвене
источник
17

Кроме того, в случае, если вы рассматриваете заполненную пробелом строку как «пустую».

Вы можете проверить это с помощью этого регулярного выражения:

!/\S/.test(string); // Returns true if blank.
Wab_Z
источник
14

Я обычно использую что-то вроде этого,

if (!str.length) {
    // Do something
}
user2086641
источник
3
Быстрее всего, если вы знаете, что переменная является строкой. Выдает ошибку, если переменная не определена.
Адриан Хоуп-Бейли
@ AdrianHope-Bailie, зачем тестировать неопределенную переменную?
Абимаэль Мартелл
2
@AbimaelMartell Почему бы и нет? У вас есть переменная, которую вы объявили или передали вам из какой-то области, которую вы не можете контролировать, например, в ответе на вызов метода или API. Можно предположить, что оно содержит значение, и использовать приведенную выше проверку, но если оно не определено или равно нулю, вы получите ошибку. var test = null; if (! test.length) {alert («
Адриан

OP спрашивал «как проверить пустую строку», неопределенная переменная не является пустой строкой. В любом случае, вы можете проверить, typeof variable != "undefined"прежде чем проверять, пусто ли.
Абимаэль Мартелл

10

Я не заметил ответа, который учитывает возможность появления нулевых символов в строке. Например, если у нас есть нулевая строка символов:

var y = "\0"; // an empty string, but has a null character
(y === "") // false, testing against an empty string does not work
(y.length === 0) // false
(y) // true, this is also not expected
(y.match(/^[\s]*$/)) // false, again not wanted

Чтобы проверить его пустоту, можно сделать что-то вроде этого:

String.prototype.isNull = function(){ 
  return Boolean(this.match(/^[\0]*$/)); 
}
...
"\0".isNull() // true

Он работает с пустой строкой и пустой строкой и доступен для всех строк. Кроме того, его можно расширить, чтобы он содержал другие пустые или пробельные символы JavaScript (т. Е. Неразрывный пробел, метка порядка байтов, разделитель строк / абзацев и т. Д.).


2
Интересный анализ. Я не думаю, что это будет актуально в 99,9% случаев. НО я недавно обнаружил, что MySQL оценивает столбец как «нулевой», если (и только если) этот столбец содержит нулевой символ («\ 0»). С другой стороны, Oracle не будет оценивать "\ 0" как нулевое, предпочитая обрабатывать его как строку длиной 1 (где этот один символ является нулевым символом). Это может вызвать путаницу, если с ней не справиться должным образом, потому что многие веб-разработчики работают с внутренней базой данных, которая может проходить через различные типы «нулевых» значений. Это должно быть в глубине души каждого разработчика.
телега верховая лошадь

10

Между тем, у нас может быть одна функция, которая проверяет все пустые значения, такие как null, undefined, '', '', {}, [] . Так что я просто написал это.

var isEmpty = function(data) {
    if(typeof(data) === 'object'){
        if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
            return true;
        }else if(!data){
            return true;
        }
        return false;
    }else if(typeof(data) === 'string'){
        if(!data.trim()){
            return true;
        }
        return false;
    }else if(typeof(data) === 'undefined'){
        return true;
    }else{
        return false;
    }
}

Варианты использования и результаты.

console.log(isEmpty()); // true
console.log(isEmpty(null)); // true
console.log(isEmpty('')); // true
console.log(isEmpty('  ')); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty({})); // true
console.log(isEmpty([])); // true
console.log(isEmpty(0)); // false
console.log(isEmpty('Hey')); // false
Имран Ахмад
Это приведет к ошибке на нулевом или неопределенном, потому что мы не должны напрямую выполнять операцию с переменной, которая является нулевой или неопределенной - проверка на str существует, прежде чем делать это, как указано в других ответах, а также заметить, что это сработает на let abc. = '' но не на let abc = '', эти два разные.
whoami
Рассмотрим let rand = ()=>Math.random(), затем rand && rand.length > 0)возвращает false, но ясно, что fn не является «пустым». Т.е. он возвращает false для любой функции, которая не имеет параметров формата.
RobG
@RobG Math.random()возвращает число, а не строку. И этот ответ о строках. ;-)
Харшит Агарвал
1
А? Если вы ожидаете строку empty(0)и empty(7)должны вернуть то же значение.
Беннет МакЭлви,
В моем конкретном случае - empty("0")должен возвращать false(потому что это не пустая строка), но empty(0)должен возвращаться, trueпотому что она пуста :)
Андрон
Но 0 не пусто! Это число, и числа не могут быть полными или пустыми. Конечно, это ваша функция и поэтому должна удовлетворять вашим требованиям, но emptyв данном случае это вводящее в заблуждение имя.
Беннет МакЭлви
Я думаю, что это имя emptyхорошо. В документации php для пустой функции: Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.разница между PHPэтой функцией и этой строкой - эта строка '0'не будет определяться как пустая.
Андрон
Как я уже сказал, это ваша функция: называйте это как хотите. Но emptyэто неточное и вводящее в заблуждение имя. Интересно, что PHP также имеет функцию с плохим именем empty, но ошибки PHP не имеют ничего общего с JavaScript.
Беннет МакЭлви
Вероятно, лучше использовать логическую (value) конструкцию, которая обрабатывает неопределенные и нулевые значения (а также 0, -0, false, NaN) как false. См. Stackoverflow.com/questions/856324/…
Журавлев А.
3
"".value.lengthвызовет ошибку. Это должно бытьstr.length === 0
AndFisher
Это TRow TypeErrorЕсли strравен undefinedилиnull
RousseauAlexandre
Какая польза от выполнения, !(!!this.length)а не просто !this(или !this.trim()для второго варианта)? Строка нулевой длины уже ложна, круглые скобки избыточны, и отрицание ее три раза - это то же самое, что отрицание ее один раз.
Джон Монтгомери
Если вы просто перестанете использовать == и используете ===, тогда это решит проблему, если (s === "").
Скотт Маркус
10

На данный момент нет прямого метода, такого как string.empty, чтобы проверить, является ли строка пустой или нет. Но в вашем коде вы можете использовать проверку оболочки для пустой строки, например:

// considering the variable in which your string is saved is named str.

if (str && str.length>0) { 

  // Your code here which you want to run if the string is not empty.

}

Используя это, вы также можете убедиться, что строка не является неопределенной или нулевой. Помните, неопределенные, нулевые и пустые три разные вещи.

Харшит Агарвал
источник
Это приведет к ошибке на нулевом или неопределенном, потому что мы не должны напрямую выполнять операцию с переменной, которая является нулевой или неопределенной - проверка на str существует, прежде чем делать это, как указано в других ответах, а также заметить, что это сработает на let abc. = '' но не на let abc = '', эти два разные.
whoami
Рассмотрим let rand = ()=>Math.random(), затем rand && rand.length > 0)возвращает false, но ясно, что fn не является «пустым». Т.е. он возвращает false для любой функции, которая не имеет параметров формата.
RobG
@RobG Math.random()возвращает число, а не строку. И этот ответ о строках. ;-)
Харшит Агарвал
10

Все эти ответы хороши.

Но я не могу быть уверен, что переменная является строкой, не содержит только пробелов (это важно для меня) и может содержать «0» (строка).

Моя версия:

function empty(str){
    return !str || !/[^\s]+/.test(str);
}

empty(null); // true
empty(0); // true
empty(7); // false
empty(""); // true
empty("0"); // false
empty("  "); // true

Образец на jsfiddle .

Андрон
источник
1
А? Если вы ожидаете строку empty(0)и empty(7)должны вернуть то же значение.
Беннет МакЭлви,
В моем конкретном случае - empty("0")должен возвращать false(потому что это не пустая строка), но empty(0)должен возвращаться, trueпотому что она пуста :)
Андрон
Но 0 не пусто! Это число, и числа не могут быть полными или пустыми. Конечно, это ваша функция и поэтому должна удовлетворять вашим требованиям, но emptyв данном случае это вводящее в заблуждение имя.
Беннет МакЭлви
Я думаю, что это имя emptyхорошо. В документации php для пустой функции: Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.разница между PHPэтой функцией и этой строкой - эта строка '0'не будет определяться как пустая.
Андрон
Как я уже сказал, это ваша функция: называйте это как хотите. Но emptyэто неточное и вводящее в заблуждение имя. Интересно, что PHP также имеет функцию с плохим именем empty, но ошибки PHP не имеют ничего общего с JavaScript.
Беннет МакЭлви
10

Я не видел хорошего ответа здесь (по крайней мере, не тот ответ, который подходит мне)

Поэтому я решил ответить себе:

value === undefined || value === null || value === "";

Вам нужно начать проверять, не определено ли оно. В противном случае ваш метод может взорваться, и тогда вы можете проверить, равен ли он нулю или равен пустой строке.

Вы не можете иметь! или только if(value)потому, что если вы проверите, 0он даст вам ложный ответ (0 - ложь).

С учетом сказанного, оберните его таким способом:

public static isEmpty(value: any): boolean { return value === undefined || value === null || value === ""; }

PS: Вам не нужно проверять typeof , так как он взорвется и выбросит еще до того, как войдет в метод

Дэви Даниэль Сипманн
источник
Вероятно, лучше использовать логическую (value) конструкцию, которая обрабатывает неопределенные и нулевые значения (а также 0, -0, false, NaN) как false. См. Stackoverflow.com/questions/856324/…
Журавлев А.
9

Если нужно обнаружить не только пустые, но и пустые строки, я добавлю к ответу Горала:

function isEmpty(s){
    return !s.length;    
}

function isBlank(s){
    return isEmpty(s.trim());    
}
Josef.B
источник
8

Попробуй это

str.value.length == 0
Doug
источник
3
"".value.lengthвызовет ошибку. Это должно бытьstr.length === 0
AndFisher
Это TRow TypeErrorЕсли strравен undefinedилиnull
RousseauAlexandre
8

Вы можете легко добавить его к собственному объекту String в JavaScript и использовать его снова и снова ...
Что-то простое, например, приведенный ниже, может помочь вам, если вы хотите проверить ''пустые строки:

String.prototype.isEmpty = String.prototype.isEmpty || function() {
  return !(!!this.length);
}

В противном случае, если вы хотите проверить как ''пустую строку, так и ' 'пробел, вы можете сделать это, просто добавив trim()что-то вроде кода ниже:

String.prototype.isEmpty = String.prototype.isEmpty || function() {
   return !(!!this.trim().length);
}

и вы можете назвать это так:

''.isEmpty(); //return true
'alireza'.isEmpty(); //return false
Алиреза
источник
Какая польза от выполнения, !(!!this.length)а не просто !this(или !this.trim()для второго варианта)? Строка нулевой длины уже ложна, круглые скобки избыточны, и отрицание ее три раза - это то же самое, что отрицание ее один раз.
Джон Монтгомери
8

Попробуй это:

export const isEmpty = string => (!string || !string.length);
V1NNY
источник
8

Я провел некоторое исследование того, что произойдет, если вы передадите не строковое и непустое / нулевое значение в функцию тестера. Как многие знают, (0 == "") верно в JavaScript, но поскольку 0 является значением, а не пустым или нулевым, вы можете проверить его.

Следующие две функции возвращают true только для неопределенных, нулевых, пустых / пробельных значений и false для всего остального, такого как числа, логические значения, объекты, выражения и т. Д.

function IsNullOrEmpty(value)
{
    return (value == null || value === "");
}
function IsNullOrWhiteSpace(value)
{
    return (value == null || !/\S/.test(value));
}

Существуют более сложные примеры, но они просты и дают согласованные результаты. Нет необходимости проверять неопределенность, поскольку она включена в проверку (value == null). Вы также можете имитировать поведение C # , добавляя их в строку следующим образом:

String.IsNullOrEmpty = function (value) { ... }

Вы не хотите помещать его в прототип Strings, потому что, если экземпляр класса String имеет значение null, он выдаст ошибку:

String.prototype.IsNullOrEmpty = function (value) { ... }
var myvar = null;
if (1 == 2) { myvar = "OK"; } // Could be set
myvar.IsNullOrEmpty(); // Throws error

Я проверил со следующим массивом значений. Вы можете пройтись по нему, чтобы проверить свои функции, если сомневаетесь.

// Helper items
var MyClass = function (b) { this.a = "Hello World!"; this.b = b; };
MyClass.prototype.hello = function () { if (this.b == null) { alert(this.a); } else { alert(this.b); } };
var z;
var arr = [
// 0: Explanation for printing, 1: actual value
    ['undefined', undefined],
    ['(var) z', z],
    ['null', null],
    ['empty', ''],
    ['space', ' '],
    ['tab', '\t'],
    ['newline', '\n'],
    ['carriage return', '\r'],
    ['"\\r\\n"', '\r\n'],
    ['"\\n\\r"', '\n\r'],
    ['" \\t \\n "', ' \t \n '],
    ['" txt \\t test \\n"', ' txt \t test \n'],
    ['"txt"', "txt"],
    ['"undefined"', 'undefined'],
    ['"null"', 'null'],
    ['"0"', '0'],
    ['"1"', '1'],
    ['"1.5"', '1.5'],
    ['"1,5"', '1,5'], // Valid number in some locales, not in JavaScript
    ['comma', ','],
    ['dot', '.'],
    ['".5"', '.5'],
    ['0', 0],
    ['0.0', 0.0],
    ['1', 1],
    ['1.5', 1.5],
    ['NaN', NaN],
    ['/\S/', /\S/],
    ['true', true],
    ['false', false],
    ['function, returns true', function () { return true; } ],
    ['function, returns false', function () { return false; } ],
    ['function, returns null', function () { return null; } ],
    ['function, returns string', function () { return "test"; } ],
    ['function, returns undefined', function () { } ],
    ['MyClass', MyClass],
    ['new MyClass', new MyClass()],
    ['empty object', {}],
    ['non-empty object', { a: "a", match: "bogus", test: "bogus"}],
    ['object with toString: string', { a: "a", match: "bogus", test: "bogus", toString: function () { return "test"; } }],
    ['object with toString: null', { a: "a", match: "bogus", test: "bogus", toString: function () { return null; } }]
];
JHM
источник
Если вы просто перестанете использовать == и используете ===, тогда это решит проблему, если (s === "").
Скотт Маркус
8

Чтобы проверить, является ли это точно пустой строкой:

if(val==="")...

Чтобы проверить, является ли это пустой строкой ИЛИ логическим эквивалентом для нулевого значения (null, undefined, 0, NaN, false, ...):

if(!val)...
Лука С.
источник
7

Там нет isEmpty()метода, вы должны проверить тип и длину:

if (typeof test === 'string' && test.length === 0){
  ...

Проверка типа необходима, чтобы избежать ошибок времени выполнения, когда testесть undefinedили null.

Агусти Санчес
источник
7

Игнорируя строки пробелов, вы можете использовать это, чтобы проверить наличие нулевых, пустых и неопределенных:

var obj = {};
(!!obj.str) // Returns false

obj.str = "";
(!!obj.str) // Returns false

obj.str = null;
(!!obj.str) // Returns false

Он лаконичен и работает для неопределенных свойств, хотя и не самый читаемый.

mricci
источник