2010-01-04 33 views
34

La siguiente línea aparentemente está escrita mejor en notación de puntos. Estoy tratando de limpiar mi código JavaScript para hacerlo estricto. Qué significa eso?notación de puntos de JavaScript

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

He añadido algo de contexto a mi línea de código, en caso de que esto ayude? No sé nada sobre DOM. No estoy tratando de soportar Internet Explorer 4, este no es mi código y no podría escribir JavaScript yo mismo. Sólo estoy tratando de conseguir que cumplen y la herramienta JSLint dice acerca de esta línea:

problema en la línea 17 caracteres 43: [ 'dhtmltooltip'] está mejor escrito en notación de punto.

+1

Primero debe probar .getElementById, porque algunos navegadores falsifican .all para compatibilidad con versiones anteriores; y byId es la funcionalidad que realmente está buscando. – Anonymous

+0

En caso de que alguien se lo esté preguntando, no parece haber ningún beneficio de rendimiento al usar cualquiera de las anotaciones: http://jsperf.com/dot-notation-vs-square-bracket-notation – Purefan

+0

Si busca un motivo para usar ab en lugar de un ['b'] revisa mi [respuesta] (http://stackoverflow.com/a/24858166/1090562) –

Respuesta

89

Hay two ways to access properties of an object in JavaScript.

notación de puntos

foo.bar.baz 

notación de corchetes

foo['bar']['baz'] 

Está utilizando este último en parte de su código.

Douglas Crockford, quien escribió JSLint (una herramienta que da ese mensaje de error), es de la opinión que es mejor usar la notación de puntos cuando sea posible.

+0

¡Gracias, eso lo explica! Parece que considera que su opinión no necesariamente es 100% válida, ¿hay alguna forma mejor que JSLint para validar mi código? – skarama

+2

No creo que haya una forma mejor de validar el código JS, que no sea ejecutarlo y probarlo. Creo que el punto que David David Dorward intentaba hacer es que ambos sean válidos, y es solo cuestión de estilo.La notación de puntos es el estilo más preferido, por la mayoría de las personas, pero no hay nada inherentemente incorrecto con el uso de la notación de corchetes. – pkaeding

+0

Gracias pkaeding. Lo que me lleva a usar JSLint en el primer lugar fue el validador W3 que decía:
carácter "&" es el primer carácter de un delimitador, pero se produjo como datos
así que pensé que haría el ingreso de toda esa secuencia de comandos, pero este error en particular ni siquiera apareció ... ¡Voy a hacer otra pregunta si no encuentro la manera! – skarama

1

Lo siguiente parece ser más fácil de usar.

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

Quizás, pero todavía usa la notación de corchetes cuadrados, por lo que no responde la pregunta. – Quentin

+0

Puede cambiar 'document.all [" dhtmltooltip "]' to 'document.all.dhtmltooltip' si lo desea. – Li0liQ

+1

Puede, y ese es el núcleo de lo que se trata la pregunta. – Quentin

0

Se trata de utilizar la capacidad de comprobación para recuperar un elemento con el id dhtmltooltip y cayendo de nuevo a un vacío String si no hay una capacidad para hacer la recuperación.

ACTUALIZACIÓN: Como otros han señalado, el cheque para getElementById debe ser el primero, y probablemente podría ser omitido ya que cualquier navegador que se podría llamar "moderna" con una cara seria que ha tenido durante mucho tiempo.

ACTUALIZACIÓN 2: Con el nuevo contexto, JSLint se queja de que no es document.all.dhtmltooltip. Probablemente debería simplemente reescribir todo como:

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

y listo.

+1

¿Qué tiene eso que ver con el uso de la notación de puntos? – Quentin

+0

Entonces, ¿esta línea reemplazaría toda mi línea, la haría más ligera y más actual pero igual funcionaría? – skarama

+0

Siempre y cuando no te importe apoyar IE 4 y otros navegadores increíblemente antiguos. –

0

Una búsqueda rápida en Google dice que document.all solo se usa para admitir IE4. Es una matriz que permite que el navegador acceda a diferentes partes del DOM (consulte here).

El código que ha publicado comprueba primero si document.all existe. De lo contrario, establece tipobj en "". Ahora, más allá de esto, no vale la pena descifrar la línea que ha publicado a menos que realmente quiera soporte IE4. Debido a que muy pocas personas todavía usan IE4 y este código no cumple con los estándares modernos, simplemente dejaré esa línea y estableceré tipobj en "".

+0

¿Qué tiene eso que ver con el uso de la notación de puntos? – Quentin

16

JSLint quiere que esto:

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

Pero hoy en día es completamente seguro asumir que existe document.getElementById, que se introdujo en el DOM Level Core 2 a partir del año 2000.

document.all está muerto, a menos que se intenta apoyar navegadores muy antiguos como IE4 (12 años de edad!):

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

Los dos fragmentos de arriba son un buen ejemplo ab la complejidad costar de apoyo muy old browser versiones:

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

+0

¿Esta línea reemplaza la mía por completo? – skarama

+0

Sí, a menos que desee admitir IE 4 o una versión anterior. – CMS

+0

¡Gracias, amable señor! – skarama

0

Parece que los únicos problemas reales a formatear/sintaxis. Esto debería funcionar exactamente igual y cumplir con las mejores prácticas de JavaScript. La diferencia principal es utilizar la notación de puntos de JavaScript en lugar de la notación de corchetes.

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

por qué no sólo tiene que utilizar:

var tipobj = dhtmltooltip.id 
No

seguro de por qué se requiere la versión larga a menos que la notación de puntos no funciona en todos los navegadores?

0

Si la notación de punto es un problema, siempre puede establecer la opción/* jslint sub: true */para anularla.

0

Como fue respondida por Quentin both ways are valid.

Una de las razones por las que prefiero usar elem.bar en lugar de elem['bar'] es que guarda 3 caracteres. Sin duda, esta no es una gran mejora, pero un 3 mordidas gratuitas por tarea no es malo.

Cuestiones relacionadas