Diferença entre Array.slice e Array (). Fatia
-
02-07-2019 - |
Pergunta
Estou passando por John Resig excelente Avançada javascript tutorial e eu não entender completamente o que é a diferença entre as seguintes chamadas: (por favor note que 'argumentos' é uma palavra embutida javascript e não é exatamente um array, portanto, a pirataria com o Array.slice em vez de simplesmente arguments.slice chamando)
>>> 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
Basicamente o meu mal-entendido se resume à diferença entre Array.slice e Array (). Fatia. O que exatamente é a diferença entre estes se comportam dois e por isso não Array.slice.call como esperado? (Que está dando para trás todos, mas o primeiro elemento da lista de argumentos).
Solução
Não é bem assim.
Veja o que acontece quando você chama String.substring.call ( "foo", 1) e String () substring.call ( "foo", 2):.
>>> String.substring.call("foo", 1)
"1"
>>> String().substring.call("foo", 1)
"oo"
Array.slice é não referenciar corretamente a função fatia anexa ao protótipo matriz nem a função fatia ligado a qualquer ocorrência de Array instanciado (como Array () ou []).
O fato de que Array.slice é ainda não nulo em tudo é uma aplicação incorrecta do objeto (/ função / construtor) em si. Tente executar o código equivalente em IE e você terá um erro que Array.slice é nulo .
É por isso que Array.slice não se comporta corretamente (nem String.substring).
Proof (a seguir é algo que nunca se deve esperar com base na definição de slice () ... assim como substring () acima):
>>> Array.slice.call([1,2], [3,4])
3,4
Agora, se você chamar corretamente slice () em qualquer um objeto instanciado ou o protótipo Array, você vai ter o que você espera:
>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]
Mais uma prova de ...
>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false
Outras dicas
Array é apenas uma função, embora um especial (usado para inicializar matrizes). Array.slice é uma referência para a função de fatia () no protótipo matriz. Só pode ser chamado de um objecto matriz e não sobre o Construtor (isto é, matriz) em si. Matriz parece comportar-se especialmente que, como matriz () retorna uma matriz vazia. Este não parece trabalho para não-builtin Construtor funções (lá você tem que usar novo). Então
Array().slice.call
é o mesmo que
[].slice.call
Como é qualquer chamada para slice.call () trabalhando nos exemplos fornecidos uma vez que um parâmetro de contexto não está sendo fornecido? Será fatia implementar seu próprio método de chamada, substituindo, assim, método chamado de JavaScript? A chamada e aplicar métodos de tomar como primeiro parâmetro um objeto para especificar o contexto (this) objeto para aplicar a invocação.
Acredito array é o tipo e Array () é a função de construtor.
Brincando na FireBug :
>>> Array === Array()
false
>>> Array.constructor
Function()
>>> Array().constructor
Array()
Bem,
Olhando para http://www.devguru.com/Technologies/ecmascript /quickref/slice.html
Array (). Fatia é uma função de (construtor) na classe de matriz, ele não pode ser usado como um membro de dados. Se você não quiser usar o '()' você precisa chamá-lo na matriz. ie - arguments.slice (1)
Meu palpite é que Array é um protótipo, enquanto Array () é um objeto de matriz real. Dependendo da interpretação JavaScript, chamando diretamente o método protótipo de um incorporado objeto de trabalho tipo de poder ou talvez não. Eu não acredito que a especificação diz que tem que trabalhar, só que chamá-lo em um instanciado objeto obras.