27 votes

Différence entre Array.slice et Array (). Slice

Je suis passer par John Resig excellente Avancée de javascript tutoriel et je ne pas bien comprendre quelle est la différence entre les appels suivants: (veuillez noter que les "arguments" est un builtin javascript mot et n'est pas exactement un tableau d'où le piratage avec le Tableau.tranche au lieu de simplement les arguments d'appel.tranche)

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

Fondamentalement, mon incompréhension se résume à la différence entre le Tableau.tranche et Array().la tranche. Quelle est exactement la différence entre les deux et pourquoi pas de Tableau.la tranche.l'appel se comporter comme prévu? (qui est de redonner à tous mais le premier élément de la liste des arguments).

39voto

kamens Points 6043

Pas tout à fait.

Regardez ce qui se passe lorsque vous appelez la Chaîne.sous-chaîne.call("foo", 1) et de la Chaîne de caractères().sous-chaîne.call("foo", 2):

>>> String.substring.call("foo", 1)
"1"

>>> String().substring.call("foo", 1)
"oo"

Tableau.la tranche est ni correctement référencement sur la tranche de la fonction relié à la Matrice prototype, ni la tranche de la fonction attachée à tout instancié occurrence de Array (comme Array() ou []).

Le fait que la Matrice.la tranche est même pas la valeur null est une mise en œuvre incorrecte de l'objet (de la fonction //constructeur) lui-même. Essayez d'exécuter le code équivalent dans IE et vous obtiendrez une erreur de ce Tableau.la tranche est null.

C'est pourquoi le Tableau.tranche ne se comporte pas correctement (ni Chaîne.sous-chaîne).

La preuve (ce qui suit est quelque chose qu'on ne devrait jamais attendre basée sur la définition de la tranche()...tout comme substring() ci-dessus):

>>> Array.slice.call([1,2], [3,4])
3,4

Maintenant, si vous l'appeler correctement slice() sur un objet instancié ou le Tableau de prototype, vous obtiendrez ce que vous attendez:

>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]

Preuve de plus...

>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false

6voto

ujh Points 1722

Tableau n'est qu'une fonction, mais une en particulier (utilisé pour initialiser les tableaux). Tableau.slice est une référence à la tranche() fonction dans le Tableau prototype. Il peut uniquement être appelée sur un objet de tableau et non pas sur le Constructeur (c'est à dire Array) lui-même. Tableau semble se comporter spécialement si, Array() renvoie un tableau vide. Cela ne semble pas fonctionner pour les non-builtin Constructeur de fonctions (là, vous avez à utiliser de nouvelles). Donc

Array().slice.call

est le même que

[].slice.call

1voto

Bill Points 11

Comment un appel à slice.call () fonctionne-t-il dans les exemples fournis car aucun paramètre de contexte n'est fourni? Slice implémente-t-il sa propre méthode d'appel, remplaçant ainsi la méthode d'appel de JavaScript? Les méthodes call et apply prennent comme premier paramètre un objet pour spécifier l'objet contextuel (this) à appliquer à l'invocation.

0voto

roosteronacid Points 9678

Je crois qu'Array est le type et Array () est la fonction constructeur.

Déconner dans FireBug :

 >>> Array === Array()
false

>>> Array.constructor
Function()

>>> Array().constructor
Array()
 

-1voto

Brad8118 Points 1285

Bien,

En regardant http://www.devguru.com/Technologies/ecmascript/quickref/slice.html

Array (). Slice est une fonction (constructeur) dans la classe array, elle ne peut pas être utilisée comme membre de données. Si vous ne souhaitez pas utiliser le '()', vous devrez l'appeler sur le tableau. ie - arguments.slice (1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X