2010-01-04 15 views
34

La seguente riga è scritta apparentemente migliore nella notazione dei punti. Sto cercando di pulire il mio codice JavaScript per renderlo rigoroso. Cosa significa?notazione dot JavaScript

if (ie||ns6) 
{ 
    var tipobj=document.all? document.all["dhtmltooltip"] : document.getElementById? document.getElementById("dhtmltooltip") : ""; 
} 

Ho aggiunto qualche contesto alla mia riga di codice, nel caso in cui questo aiuti? Non so nulla di DOM. Non sto cercando di supportare Internet Explorer 4, questo non è il mio codice e non sarei in grado di scrivere JavaScript da solo. Sto solo cercando di farlo conforme e lo strumento JSLint dice su questa linea:

Problema alla linea 17 carattere 43: [ 'dhtmltooltip'] è meglio scritto in notazione del punto.

+1

È necessario eseguire prima il test per .getElementById, perché alcuni browser simulano la compatibilità con le versioni precedenti. e byID è la funzionalità che stai davvero cercando. – Anonymous

+0

Nel caso in cui qualcuno si stia chiedendo, non sembra che ci sia alcun vantaggio sulle prestazioni dell'uso di entrambe le notazioni: http://jsperf.com/dot-notation-vs-square-bracket-notation – Purefan

+0

Se si cerca un motivo per utilizzare ab invece di una ['b'] controlla la mia [risposta] (http://stackoverflow.com/a/24858166/1090562) –

risposta

89

Ci sono two ways to access properties of an object in JavaScript.

Dot notazione

foo.bar.baz 

Piazza notazione staffa

foo['bar']['baz'] 

Si utilizza quest'ultimo in parte del codice.

Douglas Crockford, che ha scritto JSLint (uno strumento che fornisce questo messaggio di errore), è dell'opinione che sia preferibile utilizzare la notazione dei punti ove possibile.

+0

Grazie, questo lo spiega! Sembri considerare la sua opinione non necessariamente valida al 100%, c'è un modo migliore allora di JSLint per convalidare il mio codice? – skarama

+2

Non penso che esista un modo migliore per convalidare il codice JS, tranne che eseguirlo e testarlo. Penso che il punto @ Dorav Dorward stava cercando di fare è che entrambi sono validi, ed è solo una questione di stile.La notazione a punti è lo stile più preferito dalla maggior parte delle persone, ma non c'è nulla di intrinsecamente sbagliato nell'usare la notazione a parentesi quadre. – pkaeding

+0

Grazie a pkaeding. Quello che mi portano a utilizzare JSLint, in primo luogo è stato il validatore w3 Detto questo:
carattere "&" è il primo carattere di un delimitatore, ma si è verificato come dati
così ho pensato di verificare che tutta la sceneggiatura, ma questo particolare errore non è nemmeno venuto fuori. Farò un'altra domanda se non trovo un modo! – skarama

1

Quanto segue sembra essere più user-friendly.

var tipobj; 
if (document.all) 
    tipobj = document.all["dhtmltooltip"]; 
else if (document.getElementById) 
    tipobj = document.getElementById("dhtmltooltip"); 
else 
    tipobj = ""; 
+1

Forse, ma usa ancora la notazione con parentesi quadra, quindi non risponde alla domanda. – Quentin

+0

Se vuoi, puoi cambiare 'document.all [" dhtmltooltip "]' in 'document.all.dhtmltooltip'. – Li0liQ

+1

Puoi, e questo è il nocciolo della domanda. – Quentin

0

Sta utilizzando la funzionalità controllo per recuperare un elemento con l'id dhtmltooltip e cadere di nuovo ad un vuoto String se non c'è una capacità per fare il recupero.

UPDATE: Come altri hanno fatto notare, il controllo per getElementById dovrebbe essere il primo, e probabilmente potrebbe essere omessa in quanto qualsiasi browser che potremmo definire "moderna" con la faccia seria ha avuto per lungo tempo.

UPDATE 2: Con il nuovo contesto, JSLint si lamenta che non è document.all.dhtmltooltip. Probabilmente dovresti semplicemente riscrivere il tutto come:

var tipobj = document.getElementById("dhtmltooltip"); 

ed essere fatto con esso.

+1

Cosa c'entra questo con l'uso della notazione a punti? – Quentin

+0

Quindi questa linea sostituirà la mia intera linea, renderla più leggera e più attuale ma funzionerà allo stesso modo? – skarama

+0

Fintanto che non ti interessa supportare IE 4 e altri browser incredibilmente antichi. –

0

Una rapida ricerca su Google indica che lo document.all viene utilizzato solo per supportare IE4. È una matrice che consente al browser di accedere a diverse parti del DOM (vedere here.)

Il codice che è stato inviato prima verifica se esiste document.all. In caso contrario, imposta tipobj su "". Ora, al di là di questo, non vale davvero la pena decifrare la linea che hai postato a meno che tu non sia il o il supporto IE4. Poiché pochissime persone usano ancora IE4 e questo codice non è conforme a nessuno degli standard moderni, mi limito a lasciare la riga e impostare tipobj su "".

+0

Che cosa ha a che fare con l'uso della notazione a punti? – Quentin

16

JSLint vuole questo:

var tipobj= document.all ? document.all.dhtmltooltip 
         : document.getElementById 
          ? document.getElementById("dhtmltooltip") 
          : ""; 

Ma al giorno d'oggi è completamente sicuro supporre che document.getElementById esiste, è stato introdotto sul DOM Level Core 2 al 2000.

document.all è morto, a meno che non si tenta di sostenere browser molto vecchi come IE4 (12 anni!):

var tipobj = document.getElementById("dhtmltooltip"); 

I due frammenti sopra sono un buon esempio di la complessità costare di sostenere molto old browser versioni:

alt text http://ejohn.org/images/cost-benefit.png

+0

Questa linea sostituisce interamente la mia? – skarama

+0

Sì, a meno che non si desideri supportare IE 4 o precedente. – CMS

+0

Grazie gentile signore! – skarama

0

Sembra che gli unici veri problemi sta formattando/sintassi. Questo dovrebbe funzionare esattamente allo stesso modo e conforme alle migliori pratiche di javascript. La differenza principale è l'uso della notazione dot javascript invece della notazione parentesi.

if (ie || ns6) { 
    var tipobj = document.all ? document.all.dhtmltooltip : document.getElementById ? document.getElementById("dhtmltooltip") : ""; 
} 
0

perché non basta usare:

var tipobj = dhtmltooltip.id 

Non certo perché è necessaria la versione lunga a meno che il notazione non funziona in tutti i browser?

0

Se la notazione dei punti è un problema, è sempre possibile impostare/* jslint sub: true */option per sovrascriverlo.

0

Come è stato risposto da Quentin both ways are valid.

Uno dei motivi per cui preferisco utilizzare elem.bar anziché elem['bar'] è che salva 3 caratteri. Sicuramente questo non è un grande miglioramento, ma 3 morsi gratuiti per incarico non sono male.