2010-09-05 20 views
7

Necesito una función de JavaScript para decirme si un objeto de cadena está vacío. Por "vacío", quiero decir que no todo son solo caracteres en blanco. Escribí este prototipo:Determinar si una cadena está "vacía"

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

¿Esto está bien?

¿Hay una versión más performante de esto por ahí?

+5

Su 'esta === "" 'test siempre será falso ya que' this' es un objeto 'String', no una cadena nativa y, por lo tanto, nunca será" estrictamente igual "a' "" '. –

+0

¿Cómo considera la cadena '" \ 0 "'? – kiamlaluno

+0

@Matthew: ¿No son todas las cadenas nativas básicamente objetos String? De todos modos, lo probé en Firefox: 'String.prototype.foo = function() {return (this ==" ")};" ".foo()' <- funciona (al menos en Firefox)! – slebetman

Respuesta

4

Parece que necesita usar /^\s*$/.test(this) en lugar de this.test(/^\s*$/). No existe el método test() para strings, a menos que esté utilizando alguna biblioteca de JavaScript que implemente este método.

El /^\s*$/.test(this) habría sido suficiente, pero las primeras dos expresiones cortocircuitarían si alguno de ellos se evalúa como verdadero, sin tener que probar la expresión regular. Eso debería ser bastante eficiente.

Como @Matthew Crumley notado en un comentario anterior, su expresión this === " " siempre se evaluará como falsa. Se podría eliminar esta expresión, o utilizar == si usted va a estar esperando un montón de cuerdas con un único carácter de espacio:

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

No tiene sentido comprobar si 'this.length' es estrictamente igual a 0. ¿Hay algún valor válido para' this.length' que pueda ser igual a 0, sin ser 0? – kiamlaluno

+0

@kiamlaluno: Tienes razón. Pero en general, usar estrictamente iguales '===' siempre que sea posible se considera una mejor práctica entre muchos desarrolladores de JavaScript. Y creo que no hay daño en eso. –

+0

En general, podría haber daño al usar el operador '===' en al menos un caso. – kiamlaluno

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

Sólo hay una posibilidad de 255 (sin considerar los caracteres Unicode con código mayor que 255) que una cadena con longitud 1 contiene el carácter de espacio. Si se consideran cadenas con una longitud mayor que 1, la posibilidad se reduce aún más.

+0

Me gustaría desafiar esa probabilidad. ¿Por qué 1/255? Primero, asumes 255 caracteres, cuando de hecho hay bastante más. Luego, asume la misma probabilidad para cada personaje, como si eligiera uno al azar. Un espacio es * probablemente * el caracter más común en un bloque de texto, y puede ser muy común como una sola letra en el escenario del PO. – Kobi

+0

@Kobi: No hablé de probabilidad. No estoy seguro de que la secuencia de un espacio sea la cadena más probable que se pasa a una función de JavaScript; si el código de JavaScript está manejando el nombre de usuario insertado de un usuario en un formulario, una cadena de un solo espacio es probablemente la entrada menos probable. – kiamlaluno

+0

De lo que está hablando kiamlaluno es la omisión de la prueba explícita del cartel original para una cadena que contiene un solo espacio. Estoy de acuerdo que es innecesario. –

12

Uso

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())); 

Nota:

\ s coincidirán con un carácter de espacio en blanco: espacio, tabulador o nueva línea.

\ S coincidirá con el carácter no en blanco: cualquier cosa, pero no un espacio, pestaña o línea nueva. Si su cadena tiene un solo carácter que no es un espacio, pestaña o línea nueva, entonces no está vacía. Por lo tanto sólo tiene que buscar un personaje: \ T

+0

+1 por simplicidad y para manejar nuevas líneas y pestañas .. –

+0

Esta no es una buena respuesta. No has abordado el rendimiento en absoluto. Básicamente se te ocurrió una versión peor de mi implementación (si se corrigió con los comentarios de Mathew Crumley). Por ejemplo, ¿el uso de expresiones regulares sobre la verificación de la longitud de la propiedad del objeto causa una penalización de rendimiento? – CantSleepAgain

0

Jugueteé con algunas de las cosas:

  • Voy a devolver la inversa de this.length, para que 0 es true, por todo otro número que es false.
  • Quité el cheque para " ". De hecho, no he visto mucho, en los casos en que se ingresó un solo espacio, eliminar el cheque es, en promedio, más rápido.
  • Y volteó la expresión regular < -> cadena como lo hicieron los otros.

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

1

En general, el uso de RegExp.prototype.test para comprobar si hay una coincidencia de patrón sin compilación de una matriz retorno de partidos (String.prototype.match) es probable que tenga un mejor rendimiento.Me gustaría probar - pero no he probado todavía - algo así como:

function isEmpty() { 

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

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

    return empty ; 

} 

En una nota lateral, se considera mala práctica de violín con el objeto prototipo del núcleo de JavaScript objetos.

Cuestiones relacionadas