Определить, является ли строка «пустой» - PullRequest
7 голосов
/ 05 сентября 2010

Мне нужна функция JavaScript, чтобы сказать, пуст ли строковый объект. Под «пустым» я подразумеваю, что это не все пробельные символы. Я написал этот прототип:

String.prototype.isEmpty = function() {
  return this.length === 0 || this === " " || this.test(/^\s*$/);
}

Это хорошо?

Есть ли более производительная версия этого?

Ответы [ 6 ]

12 голосов
/ 05 сентября 2010

Использование

String.prototype.isEmpty = function() {  
  if (!this.match(/\S/)) {
    return ('enter some valid input.Empty space is not allowed');
  } else {
   return "correct input";
  }
}


alert("test 1:"+("    ".isEmpty()));
alert("test 2:"+("   \t ".isEmpty()));
alert("test 3:"+("  \n   ".isEmpty()));
alert("test 4:"+("hi".isEmpty()));

Примечание:

\ s будет соответствовать символу пробела: пробел, символ табуляции или новая строка.

\ S будет соответствовать непробельный символ: все, кроме пробела, табуляции или новой строки. Если ваша строка содержит один символ, который не является пробелом, символом табуляции или новой строкой, то он не пустой. Поэтому вам просто нужно найти один символ: \ S

4 голосов
/ 05 сентября 2010

Похоже, вам нужно использовать /^\s*$/.test(this) вместо this.test(/^\s*$/). Не существует метода test() для строк , если только вы не используете библиотеку JavaScript, которая реализует этот метод.

/^\s*$/.test(this) было бы достаточно, но первые два выражения могли бы закорачиваться, если любое из них оценивается как true, без необходимости проверять регулярное выражение. Это должно быть довольно эффективно.

Как заметил Мэтью Крамли в комментарии выше, ваше выражение this === " " всегда будет иметь значение false. Вы можете удалить это выражение или использовать ==, если вы ожидаете много строк с одним пробелом:

String.prototype.isEmpty = function() {
  return this.length === 0 || this == " " || /^\s*$/.test(this);
}
1 голос
/ 05 сентября 2010

Как правило, использование RegExp.prototype.test для проверки соответствия шаблону без компиляции возвращаемого массива совпадений (String.prototype.match), вероятно, имеет лучшую производительность.Я бы попробовал - но еще не тестировал - что-то вроде:

function isEmpty() {

     var string = arguments[0] ;
     var EMPTY_STRING_PATTERN = /^\s*$/ , empty = false ;

     if( EMPTY_STRING_PATTERN.exec(string) === true ) empty = true ;

     return empty ;

}

Кстати, считается плохой практикой возиться с объектом-прототипом основных объектов JavaScript.

1 голос
/ 05 сентября 2010
String.prototype.isEmpty = function() {
  return this.length == 0 || /^\s*$/.test(this);
}

Существует только вероятность из 255 (не считая символов Юникода с кодом больше 255), что строка длиной 1 содержит символ пробела.Учитывая строки с длиной больше 1, возможность становится еще ниже.

0 голосов
/ 06 сентября 2010

из примера https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/Trim

var orig="   foo  "
document.write(orig.trim())  // foo

document.write(orig.trim().length) // 3

протестировано на FF 3.6.8, Safari 5.0.1, Google Chrome 5.0.375.127, но выдает ошибку js в IE 8

0 голосов
/ 05 сентября 2010

Я возился с некоторыми вещами:

  • Я возвращаю обратное значение this.length, для 0 это true, для всего другого числа, которое false.
  • Я снял чек на " ".На самом деле я мало что видел, если бы в каких-то случаях вводился один пробел, снятие чека в среднем происходит быстрее по IMO.
  • И переворачивал строку регулярного выражения <->, как это делали другие.

String.prototype.isEmpty = function() {
return !this.length || /^\s*$/.test(this);
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...