Tipos de JavaScript


Según http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf , JavaScript tiene 6 tipos: undefined, null, boolean, string, number y object.

var und;
console.log(typeof und); // <-- undefined

var n = null;
console.log(typeof n); // <--- **object**!

var b = true;
console.log(typeof b); // <-- boolean

var str = "myString"
console.log(typeof str); // <-- string

var int = 10;
console.log(typeof int); // <-- number

var obj = {}
console.log(typeof obj); // <-- object

Pregunta 1:

¿Por qué es null de tipo object en lugar de null?

Pregunta 2:

¿Qué pasa con las funciones?

var f = function() {};
console.log(typeof f); // <-- function

Variable f tiene tipo de function. ¿Por qué no se especifica en la especificación como un tipo separado?

Gracias,

Author: Tatu Ulmanen, 2010-03-25

7 answers

Acerca de typeof null == 'object', este es un error que viene desde los primeros días, y desafortunadamente este error se quedará con nosotros durante mucho tiempo, fue demasiado tarde para ser corregido en la Especificación de la edición ECMAScript 5th.

Acerca de las funciones , son solo objetos, pero tienen una propiedad interna especial llamada [[Call]] que se utiliza internamente cuando se invoca una función.

El typeof operador distinguir entre llano objetos y funciones simplemente comprobando si el objeto tiene esta propiedad interna.

 13
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-25 18:58:25

Es porque typeof está definido para devolver "objeto" si la entrada es null, y devolver "función" si la entrada es llamable. (Véase 11.4.3 El Operador typeof.)

No se por qué el estándar se define así ( y Crockford dijo que está mal). Tal vez compatibilidad con versiones anteriores.

 5
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-25 18:28:22

Respuesta a la Pregunta 1:

Una propiedad, cuando no tiene definición, es indefinida. La razón por la que null es un objeto es para que una propiedad pueda existir sin valor y aún así tener una definición.

 0
Author: Todd Moses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-25 18:43:33

typeof null === "object" porque la especificación lo dice, pero esto es un error de la primera versión de JavaScript. (como dice KennyTM arriba).

typeof f === "function" porque, sin una try/catch, no hay otra forma confiable e infalible de determinar si algo se puede llamar. Usando f.constructor === Function podría funcionar, pero creo que no está garantizado que sea así.

 0
Author: bcherry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-25 18:53:44

Para completar, tenga en cuenta que la forma actual de mejores prácticas para verificar la información de tipo es algo como esto:

var typeInfo = Object.prototype.toString.call(yourObject);

Que le da una cadena que se parece a "[object Something]", donde "Something" es un nombre de tipo.

 0
Author: Pointy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-25 19:02:22

Null es un valor especial - no es false, no es 0, o la cadena vacía o Nan o undefined.

Null es lo que obtienes cuando buscas un objeto que no está allí- no una propiedad indefinida de un objeto, sino la cosa misma.

Un párrafo con un TextNode devolverá null para los nodos siguientes, una expresión regular que no coincide devuelve null en lugar de la matriz y así sucesivamente.

Tal vez debería tener su propio tipo, pero entonces empieza a ser algo, un algo con un tipo, en lugar de la ausencia de un objeto.

 0
Author: kennebec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-25 19:17:59

También hay Array.prototipo también.

  • Objeto.prototipo
  • Array.prototipo
  • Función.prototipo
  • Número.prototipo
  • Cadena.prototipo
  • Booleano.prototipo

Crockford dice no usar:

  • nuevo número ()
  • nueva cadena ()
  • nuevo booleano ()
 0
Author: Phillip Senn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-10 19:31:13