2010-11-15 8 views
12

En el libro Javascript las partes buenas, en la página inicial de Ch3 en objetos, se indica:¿Qué quiere decir crockford cuando dice que indefinido no puede ser un valor de propiedad?

Un objeto es un contenedor de propiedades, en que una propiedad tiene un nombre y un valor. Un nombre de propiedad puede ser cualquier cadena, incluida la cadena vacía. Un valor de propiedad puede ser cualquier valor de Javascript a excepción de indefinido.

Nota: indefinido se pone de relieve en el libro para denotar que es es un literal.

En la práctica, sin embargo, puedo hacerlo.

var a = { "name": undefined }; 

¿Qué hay de malo en mi entendimiento?

Respuesta

8

Creo que la respuesta es que está equivocado.

Como observa, puede establecer var a = { "name": undefined };.

  • a.name === undefined
  • a.name === a.someFakeProperty

Aquí es donde ellos son diferentes, sin embargo:

  • 'someFakeProperty' in a === false
  • 'name' in a === true

O, para hacerlo de una manera diferente,

  • a.hasOwnProperty('someFakeProperty') === false
  • a.hasOwnProperty('name') === true

Utilizando el bucle for..in algo infame,

for (var i in a) { 
    alert(i); 
} 

... le dará name.

Por lo tanto, es posible que no distinga entre indefinido y undefined, pero son bastante diferentes internamente.

Adición: que está equivocado acerca de los nombres de las propiedades, también - a[window] = 43; a[window] == 43; está muy bien. Claro, entonces no puede hacer a.window, pero a.___ es solo azúcar sintáctica para a['___']. Como se señaló en los comentarios, los nombres de las propiedades se convierten en cadenas, por lo que me equivoqué acerca de este bit.

+3

Él no está equivocado sobre los nombres de las propiedades, al usar la notación de corchetes, la expresión se convertirá en ToString, los nombres de propiedad pueden ser * solo cadenas *, por ejemplo: 'var o = {toString: function() {return 'foo'; }}, a = {}; a [o] = 'prueba'; alert (a ['foo']); 'en este ejemplo, acceder a 'a [o]' convertirá 'o' en string, produciendo'' foo'' como nombre de propiedad ... – CMS

+0

Sí. Pruebe 'a ['[object DOMWindow]'] == 43'. –

+0

Ah, ya veo ... el hechizo de cuerda no se me ocurrió. Respuesta corregida –

0

Tal vez esto:

var a = {"name": x}; //x is undefined, so it will cause an error. 

Sólo mi comprensión.

2

Creo que lo que está tratando de decir es que el valor de una propiedad no puede ser undefined porque undefined es exactamente cómo JavaScript denota propiedades que no existen. En otras palabras, si usted tiene el objeto siguiente

var a = { "name": undefined }; 

Entonces a.name es undefined, pero también lo es a.someFakeProperty. Sin embargo, como señala Ben Lee en su comentario, name seguirá apareciendo cuando itere las propiedades de a usando un bucle for, mientras que someFakeProperty no lo hará. Por lo tanto, parece que Crockford fue un poco impreciso al transmitir la idea en cuestión aquí.

+3

pero hay una manera de distinguir. Si haces 'a = {" name ": undefined};' y luego sigues inmediatamente con 'for (att in a) {alert (att); } ', verá aparecer' name'. Así que internamente se almacena como una propiedad del objeto, con un valor de 'undefined'. –

+0

@Ben: ¡Muy interesante! Acabo de probar eso en Firefox, y parece que tienes razón. Hmm, me pregunto qué estaba tratando de decir Crockford, entonces ... – bcat

Cuestiones relacionadas