2010-03-25 13 views
24

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.tipos de JavaScript

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 nula de tipo object en lugar de null?

Pregunta 2:

¿Qué hay de 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,

+3

+1 para cavar en la especificación, en busca de la iluminación integral. –

Respuesta

13

Sobre typeof null == 'object', esto es un error que viene desde los primeros días, y por desgracia, este error se quedará con nosotros durante mucho tiempo, era too late que se fijará en la 5ª EdiciónECMAScript Especificaciones.

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

El operador typeof distingue entre objetos simples y funciones simplemente al verificar si el objeto tiene esta propiedad interna.

5

Es porque typeof se define a la "función" volver "objeto" si la entrada es null, y regresar si la entrada es exigible. (Consulte 11.4.3 El operador typeof).

No sé por qué el estándar se define así (and Crockford said it's wrong). Tal vez compatibilidad hacia atrás.

0

respuesta a la pregunta 1:

Una propiedad, cuando no tiene una definición, no está definido. La razón por la cual null es un Objeto es para que una propiedad pueda existir sin ningún valor y aún así tener una definición.

+1

En realidad, creo que es un poco engañoso. Hay una diferencia entre indefinido y no declarado. Por ejemplo, 'var x' pondrá una propiedad llamada' x' en el alcance actual, pero su valor será 'undefined'. Antes de que esto suceda, 'x' en sí mismo no está definido, y tratar de usarlo dará como resultado' ReferenceError'. – bcherry

+1

Además, 'null' es * no * un Objeto, es un * valor primitivo *, lamentablemente el operador' typeof' es simplemente incorrecto ... – CMS

0

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

typeof f === "function" porque, sin un try/catch, no hay otra forma confiable, infalible para determinar si algo es invocable. Con f.constructor === Functionpodría funcionar, pero creo que no está garantizado.

0

Para completar, tenga en cuenta que la manera mejor práctica actual para comprobar la información de tipo es algo como esto:

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

Eso le da una cadena que se parece a "[Algo objeto]", donde "algo" es un nombre de tipo.

+0

'Object.prototype.toString.call (undefined)' me da '[ object Window] 'en Firefox o_O. – kennytm

+0

KennyTM: Eso es porque cuando 'null' o' undefined' se usan como el primer argumento de 'call' o' apply', el contexto (la palabra clave 'this') dentro de la función invocada se establecerá en el objeto global. – CMS

+0

Derecha: si usa esa técnica, probablemente haga una prueba explícita === para definirla primero sin definir – Pointy

0

null es un valor especial, no es falso, no es 0, o la cadena vacía o NaN o indefinido.

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

un párrafo con una textNode volverá nulo para el nextSibling nodos, una expresión regular que does'n rendimientos de los partidos nulo en lugar de la matriz y así sucesivamente.

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

0

También hay Array.prototype también.

  • Object.prototype
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Crockford dice no utilizar :

  • nuevo número()
  • nueva cadena()
  • new Boolean()