what - Uso de[corchetes] alrededor de las variables de JavaScript
javascript return (7)
Hemos recibido algunos JavaScript de una agencia que parece estar mal, pero funciona.
Por alguna razón, están agregando [corchetes] alrededor de las variables, por lo tanto:
var some_variable = ''to='' + [other_variable];
Esto funciona, pero los corchetes parecen completamente superfluos.
¿Hay un propósito en esta sintaxis o es técnicamente incorrecto, pero el navegador lo ignora?
Apuesto a que alguien le dijo a esa persona:
- "¡Realiza la concatenación de cadenas con una matriz, es más rápido!"
Sentido:
var some_variable = [''to='', other_variable].join("");
Lo cual es aparentemente más rápido para muchas concatenaciones, pero totalmente irrelevante, ya que ese código probablemente se ejecute solo una vez. Premature_optimization = sqrt(all_evil)
!
Y el pobre muchacho hizo esa otra cosa irrelevante ...
Amo a la gente.
Es posible construir una situación donde 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 hecho es pequeña, me imagino, pero debe mencionarse para completarla.
Incluso sin cambiar el prototipo de Array, existen diferencias:
var other_variable;
var some_variable = ''to='' + [other_variable];
Si other_variable no está definido, el valor de retorno con la matriz es ''to ='',
Sin la matriz, el valor de retorno es ''a = indefinido''.
Los corchetes significan nueva matriz.
var ar=new Array("a","b");
var ar=["a","b"]; //Equal to the syntax above
en esa situación no hay diferencia si usa corchetes o no, porque si se trata de una matriz se convierte en una cadena, pero si elimina los corchetes tarda menos tiempo porque no tiene que construir una nueva matriz y convertirla, pero funciona con una cadena simple
Solo en caso de que alguien más llegue aquí tratando de descubrir qué tipo de sintaxis extraña / nueva implica [corchetes] (visto en el Javascript de otra persona) podría ser, como yo ...
Hoy en día, con ES6, también hemos utilizado [] 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 obtener más información, consulte http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/ or google ''es6 desestructuración''.
Tal vez esto ..
Acceso de variable global con la notación de paréntesis cuadrados
La notación de corchetes requiere que haya algún tipo de referencia de objeto a la izquierda de los corchetes.
["document"] //Array literal, not a Property Accessor!
-producirá un error si se intenta asignarle un valor, ya que se tratará como un Array literal, si se intenta leer de él, se devuelve la matriz de un elemento que contiene la cadena entre corchetes. 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. Entonces, dada una variable global definida como:
var anyName = 0;
esa variable global se puede referenciar como:
ventana ["anyName"]
Al igual que con cualquier otro uso de la notación de corchetes cuadrados, la cadena dentro de los corchetes se puede mantener en una variable o construida / devuelta por una expresión.
El código que se ejecuta en el contexto global, el código dentro de las funciones globales (excepto los constructores de objetos invocados con la palabra clave nueva) y el código en línea fuera de cualquier función, también podría usar la palabra clave this 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, el uso de esta palabra clave es muy 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 objetos.
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;
ejecutado como código en línea al inicio de un script 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 esperan que
myGlobal
refiera al objeto global desde cualquier contexto de ejecución.
b = "bar" + ["foo"]
Esto es sintácticamente correcto, pero de hecho muy, muy, superfluo. Así es como funciona:
["foo"]
JavaScript toma la cadena "foo" y la convierte en una matriz con un elemento, "foo":
"bar" + ["foo"]
cuando se usa +
, y uno de los operandos es una cadena, "barra" en este caso, JavaScript convierte la segunda en una cadena. Como el operando dos es una matriz, se Array.toString
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 redefine Array.toString
podrá ver mejor lo que está sucediendo:
alert("bar" + ["foo"])
Array.prototype.toString = function() { return "???"; }
alert("bar" + ["foo"])