43

関数で複数の変数を宣言したい:

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

これはこれを行う正しい方法ですか?

var src_arr = caption_arr = fav_arr = hidden_arr = new Array();
4

6 に答える 6

84

はい、それはそれらすべてがメモリ内の同じオブジェクトを指すようにしたい場合ですが、1つが変化しても他が影響を受けないように、それらを個々の配列にしたい場合がほとんどです。

それらすべてが同じオブジェクトを指すようにしたくない場合は、

var one = [], two = [];

[]、配列を作成するための省略リテラルです。

違いを示すコンソールログは次のとおりです。

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

最初の部分では、メモリ内の同じオブジェクト/配列を定義oneしてポイントしました。twoこのメソッドを使用する.pushと、1が配列にプッシュされるため、両方が内部にありますone。2つ目は、変数ごとに一意の配列を定義したため、1つにプッシュしても、2つは影響を受けませんでした。two1

于 2010-11-02T22:16:10.983 に答える
19

すべての変数が同じオブジェクトを指すようにしたい場合でも、その割り当てパターンには近づかないでください

実際、最初の1つだけが変数宣言になり、残りは宣言されていない可能性のある識別子への割り当てにすぎません。

宣言されていない識別子(別名、宣言されていない割り当て)に値を割り当てることは、スコープチェーンで識別子が見つからない場合、GLOBAL変数が作成されるため、強くお勧めしません。例えば:

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"

さらに、ECMAScript 5th Strict Modeは、この種の割り当てを禁止します。厳密モードでは、宣言されていない識別子に割り当てを行うと、TypeError暗黙のグローバルを防ぐために例外が発生します。

対照的に、正しく書かれている場合は次のようになります。

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"
于 2010-11-02T22:29:14.690 に答える
1

いいえ、2番目のステートメントは同じ配列への4つの参照を作成します。あなたが欲しい:

var src_arr     = [],
    caption_arr = [],
    fav_arr     = [],
    hidden_arr  = [];
于 2010-11-02T22:16:00.017 に答える
0

これらの変数はすべて、1つの配列オブジェクトを参照します。

于 2010-11-02T22:17:23.930 に答える
0

すべての目的と目的で、表記構文を使用する必要があります。配列コンストラクターは、パラメーターの処理方法があいまいであるためです。literal []

ドキュメントから:

Arrayコンストラクターに渡される引数が0〜232-1(両端を含む)の整数のみである場合、これは、lengthプロパティがその数値に設定された新しいJavaScript配列を返します。そして、それは値を持つ空のスロットArray渡された長さを意味しundefinedます。

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

構文の破棄:

複数の変数を宣言するもう1つの優れた方法は、配列からの値、またはオブジェクトからのプロパティを個別の変数にアンパックできるようにする非構造化代入を使用することです。

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();

于 2019-10-09T08:43:03.920 に答える
-1

JavaScriptを使用して複数の変数を宣言するより短い方法が実際にあります。まず、1つの変数キーワード(var、let、またはconst)のみを使用して、変数の名前と値をコンマで区切って宣言できます。

const Sam="10yr", Joe="30yr", Bob="15yr", Mary="21yr";
于 2022-01-27T11:42:16.983 に答える