Curiosidades de javascript: Valores primitivos, null y undefined

Es normal escuchar a muchos desarrolladores decir que en javascript todo es un objeto. Esto en realidad es un malentendido, puesto que existen los llamados valores primitivos, strings, números y booleanos, además de dos valores especiales null y undefined

Veamos los valores primitivos. En principio, uno pensaría que son objetos, ya que podemos sin ningún problema acceder a algunos métodos de los mismos.

A primera vista, la variable foo (y por tanto, el string “bar”) es un objeto. Sin embargo, esto no es cierto. Lo que ocurre es que javascript envuelve los valores primitivos con objetos cada vez que queremos acceder a algún método y/o propiedad de los mismos. Dicho objeto, es destruido luego de la operación.

Intentar asignar 5 a la propiedad num de foo no arroja ningún tipo de error, puesto que al intentar acceder a dicha propiedad foo es envuelto en un objeto, pero luego este es destruido, por lo tanto, foo.num toma el valor undefined.

El tipo de objeto usado para envolver los valores primitivos, depende del tipo de valor. Así, los strings son envueltos por objetos String(), los numéricos por Number() y booleanos por Boolean().

Por último, no hay que confundir un valor primitivo string con un objeto del tipo String (creado mediante new String()), a pesar que puedan comportarse de forma similar (lo mismo ocurre para otros tipos de valores)

Veamos ahora que ocurre con los otros dos tipos de valores que no son objetos, undefined y null.

Cuando declaramos una variable (y no le asignamos ningún valor) esta posee el valor undefined. También es el valor que devuelve una función que no devuelve ningún valor explícito.

De acuerdo al standard Ecmascript 5, undefined es un valor primitivo de tipo undefined. Es decir, así como {false, true} son los posibles valores del tipo booleano, undefined es el único valor posible del tipo undefined.

Algo similar ocurre con null, ya que es el único valor posible para el tipo de datos null. Se utiliza para representar la ausencia intencionada de un valor. Es decir. Una variable va a valer null únicamente si es asignado de forma explícita.

Es importante tener en cuenta que ocurre al momento de comparar null o undefined con otros valores, ya sea porque utilizamos el operador == (en lugar de ===) o bien porque intentamos operar con valores de distinto tipo (Ej: 3 + null).

Cuando es evaluado como booleano, ambos devuelven false.

Al momento de intentar evaluarlos como número, undefined es evaluado como NaN

null, en cambio, es evaluado como 0+.

Por último, al intentar evaluarlos como string, cada uno equivale al string “undefined” o “null” respectivamente.

Hay que destacar que undefined es, también, una propiedad del objeto global (window, en los browsers) cuyo valor es undefined. De acuerdo al estandard Ecma, undefined es una variable que no puede ser escrita.
Sin embargo, en browsers antiguos (Ej: Firefox anterior a la versión 4) esto no era así y podíamos asignar cualquier valor a dicha propiedad, por lo que debemos tener esto en cuenta si pretendemos soportar dichos browsers.

Como última mención, podemos ver que si aplicamos el operador typeof, ocurre lo siguiente:

Es importante notar que null es tomado como de tipo object a pesar que si intentamos acceder a una propiedad de una variable null o undefined recibiremos un error de tipos.