javascript - Array.prototype.slice.call(arguments) vs. Array.prototype.slice.apply(arguments)
Publicaciones anteriores han hablado sobre cómo funciona Array.prototype.slice.call(arguments), pero no entiendo por qué estás usando call en lugar de apply cuando apply se usa para objetos tipo array, mientras que call se usa en listas de objetos separados por comas. ¿No es arguments un objeto tipo array que debería usar apply en lugar de call?
Respuesta #1
Si quieres pasar argumentos a slice en un array en lugar de uno por uno, entonces hay una diferencia. Podrías hacerlo de esta manera
[1, 2, 3, 4, 5, 6, 7] ---- our example arguments
Array.prototype.slice.call(arguments, 2, 5);
aquí pasas al método slice 2 y 5 y estos son argumentos de slice para indicar que quieres obtener los elementos del índice 1 al elemento en el índice 4. Así que lo más probable es que sea 3, 4, 5.
Array.prototype.slice.apply(arguments, [2, 5]);
Esto hace lo mismo, pero los argumentos para slice pueden pasarse en un arreglo.
Respuesta #2
Si x es un arreglo, entonces estos son iguales:
// find the "slice" method of an array and call it with "x" as its "this" argument
x.slice();
// find the "slice" method of an array and call it with "x" as its "this" argument
Array.prototype.slice.call(x);
El primer argumento de func.call es este argumento this, o, el valor de this dentro de la función. Los argumentos restantes son los argumentos de la función (en este caso no hay ninguno).
El método slice, llamado sin argumentos, simplemente crea un nuevo arreglo con el mismo contenido. Eso es lo que queremos hacer cuando hacemos Array.prototype.slice.call(arguments), sin embargo, dado que arguments no es un arreglo y por lo tanto no tiene un método slice adjunto a sí mismo, tenemos que usar el segundo de los dos métodos para obtener el método slice de un arreglo, y luego aplicarlo a algo que no es un arreglo:
// find the "slice" method of an array and call it with "arguments",
// which is *not* an array, as its "this" argument
Array.prototype.slice.call(arguments);
