Как проверить пустую / неопределенную / пустую строку в JavaScript?

2406

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

Теги:
null
is-empty

40 ответов

2760
Лучший ответ

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

if (strValue) {
    //do something
}

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

if (strValue === "") {
    //...
}
  • 128
    Тестирование свойства length на самом деле может быть быстрее, чем проверка строки на "", потому что интерпретатору не нужно будет создавать объект String из строкового литерала.
  • 12
    @ Vincent выполнил наивное профилирование в инструментах разработчика Chrome, тестирование === '' vs .length не показало заметного улучшения (а использование .length работает, только если вы предполагаете, что у вас есть строка)
Показать ещё 9 комментариев
942

Чтобы проверить, является ли строка пустой, null или undefined, я использую:

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

Для проверки пустой строки, null или undefined я использую:

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

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

String.prototype.isEmpty = function() {
    return (this.length === 0 || !this.trim());
};
  • 8
    почему 0 === str.length вместо str.length === 0?
  • 23
    @ Vincent Условия часто пишутся так, if (variable == constant value) и если вы забыли '=', то вы присваиваете постоянное значение переменной вместо тестирования. Код все еще будет работать, так как вы можете назначить переменную в if. Поэтому более безопасный способ записать это условие - поменять местами постоянное значение и переменную. Таким образом, когда вы тестируете свой код, вы увидите ошибку (неверная левосторонняя сторона в назначении). Вы также можете использовать что-то вроде JSHint, чтобы запретить присваивание в условиях и получать предупреждения при его написании.
Показать ещё 7 комментариев
253

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

if(!!str){
some code here;
}

или литье типа использования:

if(Boolean(str)){
    codes here;
}

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

  • 41
    Почему это "еще лучше"?
  • 0
    Я проверил это с помощью jsFiddle: jsFiddle
Показать ещё 18 комментариев
90

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

if(str.replace(/\s/g,"") == ""){
}
  • 7
    Но выполняет работу, если то, что вы действительно хотите проверить, это строка с непробельным содержимым. Есть ли менее дорогой способ проверить это?
  • 3
    Как насчет свойства длины?
Показать ещё 8 комментариев
87

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

if (!str.length) { ...
  • 1
    Разве это не сгенерирует исключение, если str равен null
  • 1
    @PicMickael Да! Так бы и str.Empty .
49

Я использую:

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

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
  })) // false
  • 3
    Это решение не зависит от языка. Единственная функция JavaScript, на которую он опирается - это typeof. Так что это хороший пример решения, которое вы можете использовать, когда вы не доверяете реализациям в разных браузерах и у вас нет времени, чтобы найти лучшее решение. (Т.е. нет доступа в интернет). Это что-то вроде доказательства. Не самый чистый, но вы можете быть уверены, что он будет работать, не зная слишком много о JavaScript.
  • 1
    Я бы пошел еще дальше и прибил оператором === для неопределенного случая. В противном случае это просто идеальный ответ.
Показать ещё 1 комментарий
26

Функция:

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;

  • 1
    Есть ли шанс, что вы могли бы объяснить, что делает каждая проверка? :)
  • 2
    -1 Они проверяют разные вещи. Это не имеет никакого смысла , чтобы поместить их все в одно , if заявлении.
Показать ещё 2 комментария
26

Try:

if (str && str.trim().length) {  
    //...
}
  • 2
    Требуется ли свойство длины?
  • 0
    str.trim().length будет работать быстрее, чем str.trim() , примерно на 1% в соответствии с моими собственными результатами тестирования.
25
var s; // undefined
var s = ""; // ""
s.length // 0

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

24

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

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

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

23

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

РЕДАКТИРОВАТЬ: за комментарий от Constantin, если strVar может каким-то образом положить конец целочисленному значению 0, то это действительно будет одним из тех, ситуации.

  • 10
    Плохая идея. Вы получите истину, если strVar случайно назначен 0.
  • 4
    Я согласен, что разъяснение вашего намерения более важно, чем любые микрооптимизации, которые могут принести другие методы, но использование оператора строгого сравнения === было бы лучше. Он возвращает true, только если strVar - пустая строка.
Показать ещё 3 комментария
18

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

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

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

  • 0
    Это работает, но это также ужасно дорого. Хорошо, если вы просто хотите проверить одну или две вещи, а не большой набор.
15

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

Без сомнения, для быстрой и простой реализации победитель: 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;
    }
}

Я знаю немного.

  • 2
    Проверка на неопределенные должна быть перемещена в первую очередь в проверках, иначе неопределенные элементы вызовут исключения в предыдущих проверках.
  • 0
    Полностью согласен! ХОРОШО ПОЙМАЛ. Я отредактирую свой ответ выше!
14
  • проверьте, что var a; существует
  • отредактируйте false spaces в значении, затем проверьте emptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }
    
13

Кроме того, если вы считаете заполненную пробел строку "пустой". Вы можете проверить его с помощью этого регулярного выражения:

!/\S/.test(string); // Returns true if blank.
11

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

if (!str.length) {
//do some thing
}
  • 2
    Быстрее всего, если вы знаете, что переменная является строкой. Выдает ошибку, если переменная не определена.
  • 0
    @ AdrianHope-Bailie, зачем тестировать неопределенную переменную?
Показать ещё 2 комментария
9

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

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

function isBlank(s){
    return isEmpty(s.trim());    
}
9

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

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 (где этот один символ является нулевым символом). Это может вызвать путаницу, если с ней не справиться должным образом, потому что многие веб-разработчики работают с внутренней базой данных, которая может проходить через различные типы «нулевых» значений. Это должно быть в глубине души каждого разработчика.
8

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

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

Моя версия:

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.

  • 0
    А? Если вы ожидаете строку, empty(0) и empty(7) должны возвращать одно и то же значение.
  • 0
    В моем конкретном случае - empty("0") должен возвращать false (потому что это не пустая строка), но empty(0) должен возвращать true потому что он пуст :)
Показать ещё 3 комментария
7

Между тем у нас может быть одна функция, которая проверяет все "пустые", как 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
7

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

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

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

if(!val)...
7

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

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

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

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

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 js
    ['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; } }]
];
  • 0
    Если вы просто перестанете использовать == и используете ===, тогда это решит проблему, если (s === "").
7

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

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

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

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

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

7

Я использую комбинацию, сначала выполняются самые быстрые проверки.

function isBlank(pString){
    if (!pString || pString.length == 0) {
        return true;
    }
    // checks for a non-white space character 
    // which I think [citation needed] is faster 
    // than removing all the whitespace and checking 
    // against an empty string
    return !/[^\s]+/.test(pString);
}
  • 1
    Просто интересно, не могли бы вы объяснить, когда потребуется проверка длины? Разве pString не перехватит ничего, что будет пустой / пустой строкой? Это похоже на работу. var test = ''; предупреждение if (! test) («пусто»);
6

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

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

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

6

Попробуй это

str.value.length == 0
  • 1
    "".value.length приведет к ошибке. Это должно быть str.length === 0
6

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

if (str == "") {
     //Do Something
}
else {
     //Do Something Else
}
5

Не считайте, что переменная, которую вы проверяете, является строкой. Не предполагайте, что если этот var имеет длину, то это строка.

Дело в том, что внимательно подумайте о том, что ваше приложение должно делать и может принять. Создайте что-нибудь надежное.

Если ваш метод/функция должен обрабатывать непустую строку, тогда проверьте, является ли аргумент пустой строкой, и не выполняйте "трюк".

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


var getLastChar = function (str) {
 if (str.length > 0)
   return str.charAt(str.length - 1)
}

getLastChar('hello')
=> "o"

getLastChar([0,1,2,3])
=> TypeError: Object [object Array] has no method 'charAt'

Итак, я бы придерживался


if (myVar === '')
  ...

4

Вы можете проверить следующие способы и понять разницу.

var j = undefined;
console.log((typeof j == 'undefined') ? "true":"false");
var j = null; 
console.log((j == null) ? "true":"false");
var j = "";
console.log((!j) ? "true":"false");
var j = "Hi";
console.log((!j) ? "true":"false");
4

Библиотека javascript underscore http://underscorejs.org/ предоставляет очень полезную функцию _.isEmpty() для проверки пустых строк и других пустых объектов.

Ссылка: http://underscorejs.org/#isEmpty

isEmpty _.isEmpty(object)
Возвращает true, если перечисляемый объект не содержит значений (нет перечислимых собственных свойств). Для строк и объектов типа массива _.isEmpty проверяет, является ли свойство length равным 0.

_.isEmpty([1, 2, 3]);
 = > false

_.isEmpty({});
= > true

Другие очень полезные функции подчеркивания: http://underscorejs.org/#isNull _.isNull(object)
http://underscorejs.org/#isUndefined _.isUndefined(value)
http://underscorejs.org/#has _.has(object, key)

4
function tell()
{
var pass = document.getElementById('pasword').value;
var plen = pass.length;

now you can check if your string is empty as like 
if(plen==0)
{
         alert('empty');
}
else
{
   alert('you entered something');
}
}


<input type='text' id='pasword' />

Это также общий способ проверить, пусто ли поле.

3

Вы можете легко добавить его к собственному объекту 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
3

Вы также должны всегда проверять тип, так как JavaScript - это язык с утиным языком, поэтому вы можете не знать, когда и как данные изменились в середине процесса. Итак, вот лучшее решение:

var str = "";
if (str === "") {
    //...
}
3

Я предпочитаю использовать не пустой тест вместо пустой

function isNotBlank(str) {
   return (str && /^\s*$/.test(str));
}
2

Альтернативный способ, но я считаю, что лучший ответ bdukes.

   var myString = 'hello'; 
    if(myString.charAt(0)){
    alert('no empty');
    }
    alert('empty');
2

Также неплохо проверить, что вы не пытаетесь передать термин undefined.

function TestMe() {
  if((typeof str != 'undefined') && str) {
    alert(str);
  }
 };

TestMe();

var str = 'hello';

TestMe();

Я обычно сталкиваюсь с тем случаем, когда хочу что-то сделать, когда строковый атрибут для экземпляра объекта не пуст. Это нормально, за исключением того, что атрибут не всегда присутствует.

0

Вы можете легко добавить его в собственный 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
-3
var x ="  ";
var patt = /^\s*$/g;
isBlank = patt.test(x);
alert(isBlank);// is it blank or not??
x=x.replace(/\s*/g,"");// another way of replacing blanks with ""
if (x===""){alert("ya it is blank")}
-6
<html>
<head>
<script lang="javascript">

function nullcheck()
{
var n="fdgdfg";
var e = n.length;
if(e== 0)
{

    return true;
}
else
{
    alert("sucess");
    return false;
}
}


</script>
</head>
<body>
<button type="submit" value="add" onclick="nullcheck()"></button>
</body>
</html>
-12

Чтобы проверить, не пуст ли он:

var str = "Hello World!";
var n = str.length;
if(n === ''){alert("THE STRING str is EMPTY");}

Чтобы проверить, не является ли он пустым

var str = "Hello World!";
var n = str.length;
if(n != ''){alert("THE STRING str isn't EMPTY");}
  • 1
    Неправильно. length не равна null . str = ''; str.length == 0 не str.length == null . Но в целом ваш подход в порядке.
  • 0
    Проверка свойства length приведет к тому, что строковый примитив будет обернут в строковый объект, и проверка на нулевое значение также является неправильной, так как она не ищет неопределенное (что не то же самое). Чтобы проверить наличие пустой строки, просто проверьте ее на "" (то есть, если (myString === ""))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню