web-dev-qa-db-fra.com

Déclarez plusieurs variables en JavaScript

Je veux déclarer plusieurs variables dans une fonction:

function foo() {
    var src_arr     = new Array();
    var caption_arr = new Array();
    var fav_arr     = new Array();
    var hidden_arr  = new Array();
}

Est-ce la bonne façon de procéder?

var src_arr = caption_arr = fav_arr = hidden_arr = new Array();
38
FFish

Oui, c'est si vous voulez qu'ils pointent tous vers le même objet en mémoire, mais très probablement vous voulez qu'ils soient des tableaux individuels afin que si l'un mute, les autres ne soient pas affectés.

Si vous ne voulez pas qu'ils pointent tous vers le même objet, faites

var one = [], two = [];

Le [] est un littéral raccourci pour créer un tableau.

Voici un journal de console qui indique la différence:

>> one = two = [];
[]
>> one.Push(1)
1
>> one
[1]
>> two
[1]
>> one = [], two = [];
[]
>> one.Push(1)
1
>> one
[1]
>> two
[]

Dans la première partie, j'ai défini one et two pour pointer vers le même objet/tableau en mémoire. Si j'utilise le .Push méthode, il pousse 1 vers le tableau, et donc one et two ont 1 à l'intérieur. Dans le second depuis que j'ai défini des tableaux uniques par variable, donc quand j'ai poussé à un, deux n'étaient pas affectés.

76
meder omuraliev

Veuillez rester à l'écart de ce modèle d'affectation, même si vous vouliez que toutes les variables pointent vers le même objet.

En fait, seul le premier sera un déclaration de variable, les autres ne sont que des affectations à éventuellement identificateurs non déclarés!

L'affectation d'une valeur à un identifiant non déclaré (aka affectation non déclarée ) est fortement déconseillée car, si l'identifiant n'est pas trouvé sur la chaîne de portée, une variable GLOBAL sera Être créé. Par exemple:

function test() {
    // We intend these to be local variables of 'test'.
    var foo = bar = baz = xxx = 5;
    typeof foo; // "number", while inside 'test'.
}
test();

// Testing in the global scope. test's variables no longer exist.
typeof foo; // "undefined", As desired, but,
typeof bar; // "number", BAD!, leaked to the global scope.
typeof baz; // "number"
typeof xxx; // "number"

De plus, le 5ème mode strict ECMAScript interdit ce type d'affectations. En mode strict, une affectation faite à un identifiant non déclaré provoquera une exception TypeError, pour empêcher les globaux implicites.

En revanche, voici ce que nous voyons s'il est écrit correctement:

function test() {
    // We correctly declare these to be local variables inside 'test'.
    var foo, bar, baz, xxx;
    foo = bar = baz = xxx = 5;
}
test();

// Testing in the global scope. test's variables no longer exist.
typeof foo; // "undefined"
typeof bar; // "undefined"
typeof baz; // "undefined"
typeof xxx; // "undefined"
18
CMS

Non, votre deuxième instruction créera quatre références au même tableau. Tu veux:

var src_arr     = [],
    caption_arr = [],
    fav_arr     = [],
    hidden_arr  = [];
1
hvgotcodes

À toutes fins utiles, le literal [] la syntaxe de notation doit être utilisée. Étant donné que le constructeur de tableau est ambigu dans la façon dont il traite ses paramètres .

À partir des documents:

Si le seul argument passé au constructeur Array est un entier compris entre 0 et 232-1 (inclus), cela renvoie un nouveau tableau JavaScript avec sa propriété length définie sur ce nombre. Et cela implique Array de longueur passée des emplacements vides avec undefined valeurs.

new Array(1, 2, 3); // Result: [1, 2, 3]
new Array(3); // Result: [empty × 3] with undefined at indexes
new Array('3') // Result: ['3']

//this was ambiguous
let x = new Array(5); // Result: [empty × 5]
x.Push("Hello"); //expected x as ["Hello", empty, empty, empty, empty]
//Actual x: [empty × 5, "Hello"]

Syntaxe de destruction:

Une autre façon plus efficace de déclarer plusieurs variables consiste à utiliser affectation de déstructuration qui permet de décompresser les valeurs des tableaux ou les propriétés des objets dans des éléments distincts. variables.

function foo() {
  //destructuring assignment syntax
  let [src_arr, caption_arr, fav_arr, hidden_arr] = [[], [], [], []];

  console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);

  fav_arr.Push("fav");
  hidden_arr.Push("hidden");

  //After adding some values to couple of arrays
  console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);
}

foo();
0
ambianBeing

Toutes ces variables feront référence à un objet Array.

0
heximal