from - replace array javascript
Diferencia entre Array.slice y Array(). Slice (6)
Estoy repasando el excelente tutorial avanzado de javascript de John Resig y no entiendo completamente cuál es la diferencia entre las siguientes llamadas: (tenga en cuenta que ''arguments'' es una palabra javascript incorporada y no es exactamente una matriz, por lo tanto, la piratería con Array.slice en lugar de simplemente llamar a arguments.slice)
>>> arguments
[3, 1, 2, 3]
>>> Array.slice.call( arguments )
3,1,2,3 0=3 1=1 2=2 3=3
>>> Array.slice.call( arguments, 1 )
[]
>>> Array().slice.call( arguments )
3,1,2,3 0=3 1=1 2=2 3=3
>>> Array().slice.call( arguments, 1 )
1,2,3 0=1 1=2 2=3
Básicamente mi malentendido se reduce a la diferencia entre Array.slice y Array (). Slice. ¿Cuál es exactamente la diferencia entre estos dos y por qué Array.slice.call no se comporta como se esperaba? (que devuelve todos menos el primer elemento de la lista de argumentos).
Array es solo una función, aunque especial (utilizada para inicializar matrices). Array.slice es una referencia a la función slice () en el prototipo Array. Solo se puede invocar en un objeto de matriz y no en el Constructor (es decir, la matriz). Sin embargo, Array parece comportarse especialmente, ya que Array () devuelve una matriz vacía. Esto no parece funcionar para las funciones de Constructor no integradas (allí tienes que usar nuevas). Asi que
Array().slice.call
es lo mismo que
[].slice.call
Bien,
Mirando http://www.devguru.com/Technologies/ecmascript/quickref/slice.html
Array (). Slice es una función (constructor) en la clase de matriz. No se puede usar como un miembro de datos. Si no desea utilizar ''()'', deberá llamarlo a la matriz. es decir, arguments.slice (1)
Creo que Array es el tipo y Array () es la función constructora.
Dando vueltas en FireBug :
>>> Array === Array()
false
>>> Array.constructor
Function()
>>> Array().constructor
Array()
No exactamente.
Mire lo que sucede cuando llama a String.substring.call ("foo", 1) y String (). Substring.call ("foo", 2):
>>> String.substring.call("foo", 1)
"1"
>>> String().substring.call("foo", 1)
"oo"
Array.slice no hace referencia de forma adecuada a la función de corte asociada al prototipo de matriz ni a la función de división asociada a ninguna instancia de matriz instanciada (como Array () o []).
El hecho de que Array.slice sea incluso no nulo es una implementación incorrecta del objeto (/ función / constructor). Intenta ejecutar el código equivalente en IE y obtendrás un error que Array.slice es nulo .
Es por esto que Array.slice no se comporta correctamente (ni lo hace String.substring).
Prueba (lo siguiente es algo que uno nunca debe esperar basado en la definición de slice () ... como subcadena () anterior):
>>> Array.slice.call([1,2], [3,4])
3,4
Ahora, si llama correctamente a slice () en un objeto instanciado o en el prototipo de matriz, obtendrá lo que espera:
>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]
Más pruebas ...
>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false
Supongo que Array es un prototipo, mientras que Array () es un objeto de matriz real. Dependiendo de la interpretación de JavaScript, puede ser que invoque directamente el método prototipo de un tipo de objeto incorporado o no. No creo que la especificación diga que tiene que funcionar, solo que llamarlo a un objeto instanciado funciona.
¿Cómo funciona una llamada a slice.call () en los ejemplos proporcionados ya que no se está suministrando un parámetro de contexto? ¿El sector implementa su propio método de llamada, anulando así el método de llamada de JavaScript? Los métodos call y apply toman como primer parámetro un objeto para especificar el contexto (este) objeto a aplicar a la invocación.