funciona - javascript tutorial
Tipos de JavaScript (7)
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 nulo el tipo de object
lugar de null
?
Pregunta 2:
¿Qué pasa con las funciones?
var f = function() {};
console.log(typeof f); // <-- function
La variable f
tiene tipo de function
. ¿Por qué no se especifica en la especificación como un tipo separado?
Gracias,
Acerca de typeof null == ''object''
, este es un error que viene desde los primeros días y, desafortunadamente, este error permanecerá con nosotros durante mucho tiempo, ya era demasiado tarde para corregirlo en la especificación de la 5ª edición de ECMAScript .
Acerca de las funciones , son solo objetos, pero tienen una propiedad interna especial llamada [[Call]]
que se usa internamente cuando se invoca una función.
El operador typeof
distingue entre objetos y funciones simples solo al verificar si el objeto tiene esta propiedad interna.
Para completar, tenga en cuenta que la mejor forma actual de verificar la información de tipo es algo como esto:
var typeInfo = Object.prototype.toString.call(yourObject);
Eso te da una cadena que se parece a "[object Something]", donde "Something" es un nombre de tipo.
Se debe a que typeof
está definido para devolver "objeto" si la entrada es null
, y devolver "función" si la entrada es llamable. (Ver 11.4.3 El tipo de operador.)
No sé por qué el estándar se define así ( y Crockford dijo que está mal ). Tal vez la compatibilidad hacia atrás.
También hay Array.prototype también.
- Objeto.prototipo
- Array.prototipo
- Función.prototipo
- Número.prototipo
- String.prototype
- Prototipo de Boolean
Crockford dice no usar:
- nuevo número()
- nueva cadena ()
- nuevo booleano ()
nulo es un valor especial, no es falso, no es 0, o la cadena vacía o NaN o indefinida.
nulo es lo que obtienes cuando buscas un objeto que no está allí, no una propiedad no definida de un objeto, sino la cosa en sí.
un párrafo con un textNode devolverá un valor nulo para los nodos nextSibling, una expresión regular que no coincida devuelve un valor nulo en lugar de la matriz y así sucesivamente.
tal vez debería tener su propio tipo, pero luego comienza a ser algo, algo con un tipo, en lugar de la ausencia de un objeto.
typeof null === "object"
porque la especificación lo dice, pero esto es un error desde la primera versión de JavaScript. (como dice KennyTM arriba).
typeof f === "function"
porque, sin un try
/ catch
, no hay otra forma confiable e infalible de determinar si algo es reclamable. El uso de la función f.constructor === Function
podría funcionar, pero creo que no está garantizado que así sea.
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 tenga una definición.