Table des matières
1. Que sont les arguments
2. Opération des arguments
2.1 longueur des arguments
2.2 Convertir les arguments en tableau
2.3 Modifier la valeur des arguments
2.4 Passer des paramètres d'une fonction à une autre
2.5 arguments et surcharge
3. Arguments dans ES6
3.1 Opérateur étendu
3.2 Paramètres de repos
3.3 Paramètres par défaut
3.4 Conversion d'arguments en tableau
4. Les tableaux et les objets de type tableau
Maison interface Web js tutoriel Explication détaillée de l'objet arguments JavaScript

Explication détaillée de l'objet arguments JavaScript

Mar 03, 2017 pm 03:13 PM
javascript

1. Que sont les arguments

MDN explique :

les arguments sont un objet de type tableau. Représente la liste de paramètres transmise à une fonction.

Utilisons d'abord un exemple pour comprendre intuitivement à quoi ressemblent les arguments en JavaScript.

function printArgs() {
    console.log(arguments);
}
printArgs("A", "a", 0, { foo: "Hello, arguments" });
Copier après la connexion

Le résultat de l'exécution est :

["A", "a", 0, Object]
Copier après la connexion

À première vue, le résultat est un tableau, mais ce n'est pas un vrai tableau, donc les arguments sont un objet de type tableau ( si vous voulez connaître le vrai (la différence entre les tableaux et les objets de type tableau peut être lue jusqu'à la fin).

Regardez le contenu représenté par les arguments, qui représentent tous les paramètres passés dans la fonction lorsque la fonction est exécutée. Dans l'exemple ci-dessus, il représente les quatre paramètres passés dans la fonction printArgs Vous pouvez utiliser arguments[0], arguments[1]... pour obtenir un seul paramètre.

2. Opération des arguments

2.1 longueur des arguments

arguments est un objet de type tableau, qui contient un attribut length Vous pouvez utiliser arguments.length pour obtenir le. paramètres passés dans la fonction.

function func() {
    console.log("The number of parameters is " + arguments.length);
}

func();
func(1, 2);
func(1, 2, 3);
Copier après la connexion

Le résultat de l'exécution est le suivant :

The number of parameters is 0
The number of parameters is 2
The number of parameters is 3
Copier après la connexion

2.2 Convertir les arguments en tableau

Utilisez généralement la méthode suivante pour convertir les arguments en tableau :

Array.prototype.slice.call(arguments);
Copier après la connexion

Il existe également une manière d'écrire plus courte :

[].slice.call(arguments);
Copier après la connexion

Ici, la méthode slice du tableau vide est simplement appelée, sans l'appeler depuis le niveau prototype d'Array.

Pourquoi les deux méthodes ci-dessus peuvent-elles être converties ?

Tout d'abord, le résultat obtenu par la méthode slice est un tableau, et le paramètre est des arguments. En fait, les objets qui remplissent certaines conditions peuvent être convertis en tableaux par la méthode slice. Prenons un exemple :

const obj = { 0: "A", 1: "B", length: 2 };
const result = [].slice.call(obj);
console.log(Array.isArray(result), result);
Copier après la connexion

Le résultat de l'exécution est :

true ["A", "B"]
Copier après la connexion

Comme le montre l'exemple ci-dessus, les conditions sont : 1) Les attributs sont 0, 1, 2 ...; 2) With length attribut;

De plus, une chose à noter est que les arguments de la fonction ne peuvent pas être divulgués ou transmis. Qu'est-ce que ça veut dire? Regardez les exemples suivants de fuites d'arguments :

// Leaking arguments example1:
function getArgs() {
    return arguments;
}

// Leaking arguments example2:
function getArgs() {
    const args = [].slice.call(arguments);
    return args;
}

// Leaking arguments example3:
function getArgs() {
    const args = arguments;
    return function() {
        return args;
    };
}
Copier après la connexion

L'approche ci-dessus divulgue directement l'objet arguments de la fonction. Le résultat final est que le moteur V8 ignorera l'optimisation, ce qui entraînera une perte de performances considérable.

Vous pouvez faire ceci :

function getArgs() {
    const args = new Array(arguments.length);
    for(let i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}
Copier après la connexion

C'est très curieux Chaque fois que nous utilisons des arguments, la première étape est généralement de les convertir en tableau. En même temps, une utilisation inappropriée de. les arguments peuvent facilement entraîner une perte de performances, alors pourquoi ne pas concevoir des arguments directement sous forme d'objets de tableau ?

Cela doit commencer depuis le début de cette langue. Les arguments ont été introduits au début du langage, lorsque l'objet Array disposait de quatre méthodes : toString, join, reverse et sort. La principale raison pour laquelle les arguments héritent d'Object est que ces quatre méthodes ne sont pas nécessaires. Désormais, Array a ajouté de nombreuses méthodes puissantes, telles que forEach, map, filter, etc. Alors pourquoi ne pas laisser les arguments réhériter d'Array dans la nouvelle version ? En fait, cela a été inclus dans le projet ES5, mais pour des raisons de compatibilité ascendante, il a finalement été rejeté par le comité.

2.3 Modifier la valeur des arguments

En mode strict et en mode non strict, les résultats de la modification des valeurs des paramètres de fonction sont différents. Regardez les deux exemples ci-dessous :

function foo(a) {
    "use strict";
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);
Copier après la connexion

Sortie :

1 1
10 1
10 20
Copier après la connexion

Un autre exemple de mode non strict :

function foo(a) {
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);
Copier après la connexion

La sortie est :

1 1
10 10
20 20
Copier après la connexion

Comme le montrent les deux exemples ci-dessus, en mode strict, les paramètres de la fonction n'ont aucun lien avec l'objet arguments, et la modification d'une valeur ne changera pas l'autre valeur. En mode non strict, les deux s'influenceront mutuellement.

2.4 Passer des paramètres d'une fonction à une autre

Ce qui suit est la pratique recommandée pour passer des paramètres d'une fonction à une autre.

function foo() {
    bar.apply(this, arguments);
}
function bar(a, b, c) {
    // logic
}
Copier après la connexion

2.5 arguments et surcharge

La surcharge est disponible dans de nombreuses langues, mais pas en JavaScript. Regardons d'abord un exemple :

function add(num1, num2) {
    console.log("Method one");
    return num1 + num2;
}

function add(num1, num2, num3) {
    console.log("Method two");
    return num1 + num2 + num3;
}

add(1, 2);
add(1, 2, 3);
Copier après la connexion

Le résultat de l'exécution est :

Method two
Method two
Copier après la connexion

Ainsi, en JavaScript, les fonctions n'effectuent pas d'appels différents en fonction de différents paramètres.

N'y a-t-il pas de surcharge en JavaScript ? Non, nous pouvons utiliser des arguments pour simuler une surcharge. Toujours l'exemple ci-dessus.

function add(num1, num2, num3) {
    if (arguments.length === 2) {
        console.log("Result is " + (num1 + num2));
    }
    else if (arguments.length === 3) {
        console.log("Result is " + (num1 + num2 + num3));
    }
}

add(1, 2);
add(1, 2, 3)
Copier après la connexion

Le résultat de l'exécution est le suivant :

Result is 3
Result is 6
Copier après la connexion

3. Arguments dans ES6

3.1 Opérateur étendu

Directement au châtaignier :

function func() {
    console.log(...arguments);
}

func(1, 2, 3);
Copier après la connexion

Le résultat de l'exécution est :

1 2 3
Copier après la connexion

Succinctement parlant, l'opérateur d'expansion peut développer des arguments en paramètres indépendants.

3.2 Paramètres de repos

Toujours le meilleur :

function func(firstArg, ...restArgs) {
    console.log(Array.isArray(restArgs));
    console.log(firstArg, restArgs);
}

func(1, 2, 3);
Copier après la connexion

Le résultat de l'exécution est :

true
1 [2, 3]
Copier après la connexion

Comme le montrent les résultats ci-dessus , Les paramètres de repos représentent l'ensemble de paramètres restant, à l'exception de ceux explicitement spécifiés, et le type est Array.

3.3 Paramètres par défaut

Chestnut :

function func(firstArg = 0, secondArg = 1) {
    console.log(arguments[0], arguments[1]);
    console.log(firstArg, secondArg);
}

func(99);
Copier après la connexion

Le résultat de l'exécution est :

99 undefined
99 1
Copier après la connexion

On voit que les paramètres par défaut n'ont pas effet sur les arguments, les arguments sont toujours Représente simplement tous les paramètres transmis lors de l'appel de la fonction.

3.4 Conversion d'arguments en tableau

Array.from() est une méthode très recommandée, qui peut convertir tous les objets de type tableau en tableaux.

4. Les tableaux et les objets de type tableau

Les tableaux ont une fonctionnalité de base : l'index. C’est quelque chose que les objets ordinaires n’ont pas.

const obj = { 0: "a", 1: "b" };
const arr = [ "a", "b" ];
Copier après la connexion

我们利用 obj[0]arr[0] 都能取得自己想要的数据,但取得数据的方式确实不同的。obj[0] 是利用对象的键值对存取数据,而arr[0] 却是利用数组的索引。事实上,Object 与 Array 的唯一区别就是 Object 的属性是 string,而 Array 的索引是 number。

下面看看类数组对象。

伪数组的特性就是长得像数组,包含一组数据以及拥有一个 length 属性,但是没有任何 Array 的方法。再具体的说,length 属性是个非负整数,上限是 JavaScript 中能精确表达的最大数字;另外,类数组对象的 length 值无法自动改变。

如何自己创建一个类数组对象?

function Foo() {}
Foo.prototype = Object.create(Array.prototype);

const foo = new Foo();
foo.push(&#39;A&#39;);
console.log(foo, foo.length);
console.log("foo is an array? " + Array.isArray(foo));
Copier après la connexion

执行结果是:

["A"] 1
foo is an array? false
Copier après la connexion

也就是说 Foo 的示例拥有 Array 的所有方法,但类型不是 Array。

如果不需要 Array 的所有方法,只需要部分怎么办呢?

function Bar() {}
Bar.prototype.push = Array.prototype.push;

const bar = new Bar();
bar.push(&#39;A&#39;);
bar.push(&#39;B&#39;);
console.log(bar);
Copier après la connexion

执行结果是:

Bar {0: "A", 1: "B", length: 2}
Copier après la connexion

 以上就是JavaScript arguments 对象详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment convertir le tableau de résultats d'une requête MySQL en objet ? Comment convertir le tableau de résultats d'une requête MySQL en objet ? Apr 29, 2024 pm 01:09 PM

Voici comment convertir un tableau de résultats de requête MySQL en objet : Créez un tableau d'objets vide. Parcourez le tableau résultant et créez un nouvel objet pour chaque ligne. Utilisez une boucle foreach pour attribuer les paires clé-valeur de chaque ligne aux propriétés correspondantes du nouvel objet. Ajoute un nouvel objet au tableau d'objets. Fermez la connexion à la base de données.

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Quelle est la différence entre les tableaux et les objets en PHP ? Quelle est la différence entre les tableaux et les objets en PHP ? Apr 29, 2024 pm 02:39 PM

En PHP, un tableau est une séquence ordonnée et les éléments sont accessibles par index ; un objet est une entité avec des propriétés et des méthodes, créée via le mot-clé new. L'accès au tableau se fait via l'index, l'accès aux objets se fait via les propriétés/méthodes. Les valeurs du tableau sont transmises et les références d'objet sont transmises.

Qu'est-ce que l'objet Request en PHP ? Qu'est-ce que l'objet Request en PHP ? Feb 27, 2024 pm 09:06 PM

L'objet Request en PHP est un objet utilisé pour gérer les requêtes HTTP envoyées par le client au serveur. Grâce à l'objet Request, nous pouvons obtenir les informations de demande du client, telles que la méthode de demande, les informations d'en-tête de demande, les paramètres de demande, etc., afin de traiter et de répondre à la demande. En PHP, vous pouvez utiliser des variables globales telles que $_REQUEST, $_GET, $_POST, etc. pour obtenir les informations demandées, mais ces variables ne sont pas des objets, mais des tableaux. Afin de traiter les informations demandées de manière plus flexible et plus pratique, vous pouvez

Comment obtenir facilement le code d'état HTTP en JavaScript Comment obtenir facilement le code d'état HTTP en JavaScript Jan 05, 2024 pm 01:37 PM

Introduction à la méthode d'obtention du code d'état HTTP en JavaScript : Dans le développement front-end, nous devons souvent gérer l'interaction avec l'interface back-end, et le code d'état HTTP en est une partie très importante. Comprendre et obtenir les codes d'état HTTP nous aide à mieux gérer les données renvoyées par l'interface. Cet article explique comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournit des exemples de code spécifiques. 1. Qu'est-ce que le code d'état HTTP ? Le code d'état HTTP signifie que lorsque le navigateur lance une requête au serveur, le service

À quoi dois-je faire attention lorsqu'une fonction C++ renvoie un objet ? À quoi dois-je faire attention lorsqu'une fonction C++ renvoie un objet ? Apr 19, 2024 pm 12:15 PM

En C++, il y a trois points à noter lorsqu'une fonction renvoie un objet : Le cycle de vie de l'objet est géré par l'appelant pour éviter les fuites mémoire. Évitez les pointeurs suspendus et assurez-vous que l'objet reste valide après le retour de la fonction en allouant dynamiquement de la mémoire ou en renvoyant l'objet lui-même. Le compilateur peut optimiser la génération de copie de l'objet renvoyé pour améliorer les performances, mais si l'objet est transmis par sémantique de valeur, aucune génération de copie n'est requise.

See all articles