Cada función de JavaScript puede acceder a una variable especial: argumentos dentro de su alcance. Esta variable contiene una lista de todos los parámetros pasados a la función.
El objeto de argumentos no es una matriz. Aunque sintácticamente tiene el mismo lugar que una matriz, por ejemplo, tiene la propiedad de longitud. Pero no se hereda del array.prototype, de hecho, es un objeto.
Por lo tanto, no podemos usar directamente algunos métodos de matriz para argumentos, como Push, Pop o Slice, etc. Por lo tanto, para usar estos métodos, necesitamos convertirlo en una matriz real.
Convertir a una matriz
El siguiente código devolverá una matriz que contenga todos los elementos del objeto de argumentos.
Array.prototype.slice.call (argumentos);
Debido a que la velocidad de conversión es muy lenta, esto no se recomienda en programas con requisitos de rendimiento estrictos.
Pasar parámetros
Aquí hay un método más recomendado para pasar el objeto Argumentos de una función a otra.
La copia del código es la siguiente:
función foo () {
bar.apply (nulo, argumentos);
}
Barra de funciones (a, b, c) {
// hacer cosas aquí
}
Hay otro método inteligente, que es crear rápidamente un método externo de desabrochación utilizando la llamada y aplicar al mismo tiempo.
La copia del código es la siguiente:
función foo () {}
Foo.prototype.method = function (a, b, c) {
console.log (this, a, b, c);
};
// crear una versión no unida de "método"
// Toma los parámetros: esto, arg1, arg2 ... argn
Foo.method = function () {
// resultado: foo.prototype.method.call (this, arg1, arg2 ... argn)
Function.call.apply (foo.prototype.method, argumentos);
};
La relación entre los parámetros de la función y los atributos de los argumentos
El objeto de argumentos crea métodos getter y setter tanto para sus propias propiedades como para parámetros de función.
Por lo tanto, modificar los parámetros formales de la función afectará los valores de propiedad del objeto de argumentos correspondientes y viceversa.
La copia del código es la siguiente:
función foo (a, b, c) {
argumentos [0] = 2;
a; // 2
b = 4;
argumentos [1]; // 4
var d = c;
d = 9;
do; // 3
}
foo (1, 2, 3);
Problemas de rendimiento
Los argumentos no se crearán en solo dos casos, uno se declara como una variable local dentro de la función, y el otro se usa como un parámetro formal de la función. En otros casos, el objeto de argumentos siempre se creará.
Dado que los métodos Getter y Setter siempre se crean con la creación de objetos de argumentos, el uso de argumentos tiene poco efecto en el rendimiento en sí.
Sin embargo, hay una situación que afecta seriamente el rendimiento de JavaScript, que es usar argumentos. Callee.
La copia del código es la siguiente:
función foo () {
argumentos.callee; // Haz algo con este objeto de función
argumentos.callee.caller; // y el objeto de función de llamadas
}
función bigloop () {
para (var i = 0; i <100000; i ++) {
foo (); // normalmente se inclinaría ...
}
}
En el código anterior, la función FOO ya no es una extensión en línea simple, porque necesita conocerse a sí mismo y a su persona que llama. Esto no solo compensa las mejoras de rendimiento traídas por las extensiones en línea, sino que también socava la encapsulación de la función, porque la función en sí misma puede necesitar confiar en un fondo de llamadas específico.
Por lo tanto, se recomienda que intente no usar argumentos.callee.
Lo anterior se trata del objeto de argumentos JavaScript. ¿Lo sabes a fondo? Simplemente poner
Los argumentos se refieren al objeto de parámetro de la función (se refiere a los parámetros aprobados reales)
argumentos. La longitud se refiere a la longitud del objeto de parámetro de la función.
Los argumentos [i] se refieren al valor del parámetro i-th (el primero es 0)