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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top