2009-10-27 15 views
32

Hemos recibido algunos JavaScript de una agencia que parece incorrecta, pero funciona.Uso de [corchetes] alrededor de variables de JavaScript

Por alguna razón están añadiendo corchetes [] alrededor de las variables, por lo tanto:

var some_variable = 'to=' + [other_variable]; 

Esto funciona, pero los corchetes parece totalmente superflua.

¿Existe un propósito para esta sintaxis o es técnicamente incorrecto, pero el navegador lo ignora?

Respuesta

41

Soportes cuadrados significa nueva matriz.

var ar=new Array("a","b"); 
var ar=["a","b"]; //Equal to the syntax above 

en esa situación no hay ninguna diferencia si se utiliza corchetes o no, porque si se trata de un conjunto que se convierte en cadena, pero si elimina los soportes se tarda menos tiempo, ya que no tiene que construir una nueva matriz y convertirla, pero funciona con una cadena simple.

+1

Entonces, en mi opinión, ¿se está creando una nueva matriz que contiene un elemento? –

+1

sí. significa que hay un elemento de matriz creado. – Murvinlai

+4

Sí y luego se convierte en cadena – mck89

5

Puede ser esto ..

acceso variable global con el corchete de la notación

La notación de corchetes requiere que haya algún tipo de referencia de objeto a la izquierda de los soportes.

["document"] //Array literal, not a Property Accessor! 

-Will producir un error si se hace un intento para asignar un valor a la misma, ya que será tratada como una matriz literal, si un intento de leer de él se hace la matriz de un elemento que contiene la cadena dentro de los corchetes se devuelve. Las variables globales normalmente se referencian por su único identificador. Esto parecería excluir las variables globales de la posibilidad de que se haga referencia a ellas usando una cadena que contenga su nombre de identificador o una expresión que genere, o devuelva, su nombre. Sin embargo, las variables globales de JavaScript (y los nombres de funciones globales para el caso) son propiedades de un objeto global. Cualquier identificador que contenga una referencia al objeto global se puede usar a la izquierda de los corchetes para formar un acceso de propiedad que se refiere a una variable global.

En un navegador web, el objeto global es la ventana (o marco) en la que se ejecuta el script. Cada objeto de ventana (o marco) contiene varias propiedades, de las cuales al menos dos son referencias a la ventana (objeto global). Estas propiedades son 'ventana' y 'auto'. Estos nombres de propiedad se pueden usar como el identificador a la izquierda de los corchetes cuando se hace referencia a variables globales. Así que dada una variable global definida como: -

var anyName = 0; 
  • esa variable global puede ser referenciado como: -

    ventana [ "anyname"]

Al igual que con cualquier otro uso de la notación de corchetes, la cadena dentro de los corchetes se puede mantener en una variable o construir/devolver por una expresión.

El código que se ejecuta en el contexto global, el código dentro de funciones globales (excepto los constructores de objetos invocados con la nueva palabra clave) y el código en línea fuera de cualquier función, también podría usar la palabra clave para referirse al objeto global. La palabra clave this se refiere a un objeto que depende del contexto de ejecución.Para la ejecución de código en el contexto global, este es el objeto global (en un navegador web, el objeto ventana). Como resultado, la variable anterior podría denominarse así ["anyName"], pero solo en el código que se está ejecutando en el contexto global.

Sin embargo, usar esta palabra clave es muy probable que sea confuso, especialmente en scripts que incluyen objetos JavaScript personalizados donde los métodos (y constructores) de esos objetos estarían usando esto para referirse a sus propias instancias de objeto.

Algunas implementaciones de JavaScript no tienen una propiedad del objeto global que hace referencia al objeto global. En lugar de tratar de usar la palabra clave this para acceder a las variables globales, es posible crear su propia variable global que haga referencia al objeto global.

var myGlobal = this; 
  • ejecutados como código en línea en el inicio de una secuencia de comandos asignará una referencia al objeto global (esto en ese contexto). A partir de ese momento, todas las variables globales se pueden referenciar con notación de corchetes como: -

    myGlobal ["anyName"];

  • y espera myGlobal para hacer referencia al objeto global desde cualquier contexto de ejecución.

14
b = "bar" + ["foo"] 

Ésta es sintácticamente correcta, pero de hecho muy, muy, superfluo. Así es como funciona:

["foo"] 

JavaScript toma la cadena "foo" y la convierte en una matriz con un solo elemento, "foo":

"bar" + ["foo"] 

cuando + se utiliza, y una de las operandos es una cadena, "barra" en este caso, JavaScript convierte la segunda en una cadena. Como el operando dos es una matriz, se llama al método Array.toString, que, de forma predeterminada, devuelve todos los elementos unidos por una coma. Tenemos un elemento, y el resultado será igual a este elemento, es decir, en este contexto "foo" es equivalente a ["foo"].

Si se redefine Array.toString se puede ver mejor lo que está pasando:

alert("bar" + ["foo"]) 
Array.prototype.toString = function() { return "???"; } 
alert("bar" + ["foo"]) 
9

apuesto a alguien le dijo a esa persona: "Hacer la concatenación de cadenas con una matriz, que es más rápido"

Significado:

var some_variable = ['to=', other_variable].join(""); 

que es aparentemente más rápido para un montón de concatenaciones, pero totalmente irrelevante ya que el código probablemente realizará una sola vez de todos modos. Premature_optimization = sqrt(all_evil)!

Y el pobre hombre hizo esa otra cosa irrelevante ...

Me encanta la gente.

9

Es posible construir una situación en la que esto:

var some_variable = 'to=' + other_variable; 

y esto:

var some_variable = 'to=' + [other_variable]; 

producir diferentes resultados. Específicamente, si el método Array.prototype.toString() (o, supongo, el método Array.prototype.join()) se ha cambiado de su valor predeterminado, podría pasar cualquier cosa. Por ejemplo, se podría agregar una funcionalidad adicional al método Array.prototype.toString() para generar información de registro, hacer algunas búsquedas, o cualquier cosa realmente.

La probabilidad de que esto se haya realizado es pequeña, me imagino, pero debe mencionarse para completarla.

28

Incluso sin cambiar el prototipo de matriz existen notables diferencias:

var other_variable; 
var some_variable = 'to=' + [other_variable]; 

Si other_variable no está definido, el valor de retorno con la matriz es '=',

Sin la matriz el valor de retorno es ' to = indefinido '.

4

Sólo en caso de cualquier otra persona llega aquí mientras intentaba averiguar qué algunos extraños/nueva sintaxis que implica [corchetes] (visto en algún otro Javascript), posiblemente, podría ser, como si estuviera ...

Hoy en día, con ES6, también usamos [] en el lado izquierdo para desestructurar matrices, por ejemplo

const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names; 
console.log(first); // 'Luke' 
const [first, second] = names; 
console.log(first, second); // 'Luke' 'Eva' 

Para más información ver http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/ o Google 'es6 desestructuración'.

Cuestiones relacionadas