2010-11-15 7 views
12

Nel libro Javascript le parti buone, nella pagina di apertura del Ch3 su oggetti, essa afferma:Cosa significa crockford quando dice che un indefinito non può essere un valore di una proprietà?

Un oggetto è un contenitore di proprietà, in cui una proprietà ha un nome e un valore. Un nome di proprietà può essere qualsiasi stringa, inclusa la stringa vuota. Un valore di proprietà può essere qualsiasi valore Javascript tranne che non definito.

Nota: indefinito è evidenziato nel libro per indicare che è è un letterale.

In pratica, tuttavia, sono in grado di farlo.

var a = { "name": undefined }; 

Cosa c'è di sbagliato nella mia comprensione?

risposta

8

Credo che la risposta è che si sbaglia.

Come si osserva, è possibile impostare var a = { "name": undefined };.

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

Ecco dove sono diversi, però:

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

O, per fare un modo diverso,

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

Utilizzando la un po 'infame for..in ciclo,

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

... vi darà name.

Quindi, per valore potrebbe non essere possibile distinguere undefined e undefined, ma sono abbastanza diversi internamente.

Aggiunta: ha torto anche sui nomi delle proprietà - a[window] = 43; a[window] == 43; va bene. Certo, non puoi quindi fare a.window, ma a.___ è solo zucchero sintattico per a['___']. Come indicato nei commenti, i nomi delle proprietà vengono convertiti in string, quindi ho sbagliato su questo bit.

+3

Non ha sbagliato sui nomi delle proprietà, quando usa la notazione delle parentesi, l'espressione sarà convertita in ToString, i nomi delle proprietà possono essere * solo stringhe *, ad esempio: 'var o = {toString: function() {return 'foo'; }}, a = {}; a [o] = 'test'; alert (a ['foo']); 'in questo esempio, l'accesso a' a [o] 'convertirà' o' in stringa, producendo ''foo'' come nome di proprietà ... – CMS

+0

Sì. Prova 'a ['[oggetto DOMWindow]'] == 43'. –

+0

Ah, capisco ... il cast delle corde non mi è venuto in mente. Risposta corretta –

0

Forse questo:

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

solo la mia comprensione.

2

Penso che quello che sta cercando di dire è che il valore di una proprietà non può essere undefined perché undefined è esattamente come JavaScript denota proprietà che non esistono. In altre parole, se avete la seguente oggetto

var a = { "name": undefined }; 

Poi a.name è undefined, ma lo è anche a.someFakeProperty. Tuttavia, come Ben Lee sottolinea nel suo commento, name verrà ancora visualizzato quando si itera le proprietà di a utilizzando un ciclo for, mentre non lo sarà il someFakeProperty. Pertanto, sembra che Crockford sia stato un po 'impreciso nel trasmettere l'idea in questione qui.

+3

ma c'è un modo per distinguere. Se fai 'a = {" name ": undefined};' e poi immediatamente follow up con 'for (att in a) {alert (att); } ', vedrai' nome' venire. Così internamente è immagazzinato come una proprietà dell'oggetto, con un valore di 'undefined'. –

+0

@ Ben: molto interessante! L'ho appena testato in Firefox, e sembra che tu abbia ragione. Hmm, mi chiedo cosa stava cercando di dire Crockford, quindi ... – bcat

Problemi correlati