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,
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.
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.
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.
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í.
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.
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.
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 ()
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