2011-04-22 9 views
6

MDN estados:javascript: ¿las cadenas primitivas tienen métodos?

primitiva de valor, primitivo

A datos que no es un objeto y hace no tiene ningún métodos. JavaScript tiene 5 tipos de datos primitivos: cadena, número, booleano, nulo, indefinido. Con la excepción null e indefinido, todos los valores de las primitivas tienen equivalentes del objeto que se ajustan a los valores primitivos , p. Ej. un objeto String se envuelve alrededor de una primitiva de cadena. Todas las primitivas son inmutables.

Así que cuando llamamos a un "s".replace o "s".anything es lo equivalente a new String("s").replace y new String("s").anything?

Respuesta

12

No, las primitivas de cadena no tienen métodos. Al igual que con las primitivas numéricos, el tiempo de ejecución de JavaScript promoverá a los objetos en toda regla "String" cuando se le pide a hacerlo por construcciones como:

var space = "hello there".indexOf(" "); 

En algunos idiomas (bueno, Java, en particular, pero creo que la término es de uso común) se dice que el lenguaje "recuadros" las primitivas en sus envoltorios de objetos cuando sea apropiado. Con los números es un poco más complicado debido a los caprichos de la gramática del token; no se puede simplemente decir

var foo = 27.toLocaleString(); 

porque el "." no se interpretará de la manera en que lo necesitarías; sin embargo:

var foo = (27).toLocaleString(); 

funciona bien. Con primitivas cadena — y booleanos, para el caso — la gramática no es ambigua, así por ejemplo:

var foo = true.toString(); 

va a funcionar.

+0

heys btw es la sintaxis de doble punto "estándar"? Al igual que 27..toLocaleString() – Pacerier

+0

Bueno, parece que funciona en Chrome al menos ... el problema es que la "gramática de tokens" de bajo nivel enganchará al primero "." en el número, debido a la forma en que se ven los números de coma flotante ("23.223"). Pero ese truco de doble punto * debería * funcionar, porque el tokenizador se detendrá en el segundo ".", Dejándolo al analizador para construir la expresión de referencia de la propiedad. – Pointy

+0

Personalmente, preferiría '(27) .toLocaleString()' porque es fácil perder la noción un poco "." atrapado allí. Pero eso es solo una opinión estilística y no vale mucho :-) – Pointy

4

La respuesta técnicamente correcta es "no".

La respuesta en el mundo real es "no, pero funcionará de todos modos". Eso es porque cuando haces algo como

"s".replace() 

el intérprete sabe que usted quiere operar en realidad en la cadena como si hubiera creado con

var str = new String("s") 

y por lo tanto actúa como si hubiera hecho eso.

Cuestiones relacionadas