2009-10-27 11 views
32

私は間違っているが動作している代理店からJavaScriptをいくつか受け取りました。JavaScript変数の前後に[角括弧]を使用する

var some_variable = 'to=' + [other_variable]; 

これは動作しますが、角括弧は完全に余計なようだ:彼らはこのように、変数の周り[角括弧]を追加しているいくつかの理由

この構文には目的がありますか、または技術的に間違っていますが、ブラウザでは無視されますか?

答えて

41

角括弧は新しい配列を意味します。そのような状況で

var ar=new Array("a","b"); 
var ar=["a","b"]; //Equal to the syntax above 

それは、アレイの場合、それは文字列に変換されていますが、括弧を削除した場合、それが構築する必要がないので、それはあまり時間がかかりますので、あなたが角括弧を使用するかどう違いはありません新しい配列とそれを変換しますが、単純な文字列で動作します。

+1

私の例では、1つの要素を含む新しい配列が作成されていますか? –

+1

はい。作成された配列要素が1つあることを意味します。 – Murvinlai

+4

はい、文字列に変換されます – mck89

5

であってもよい。この..角括弧表記

角括弧表記と

グローバル変数へのアクセスは、ブラケットの左側へのオブジェクト参照のいくつかの並べ替えが存在することを必要とします。そこから読み取るための試みが文字列を含む1個の素子アレイ構成されている場合、それは、配列リテラルとして扱われるようにしようと、それに値を割り当てるように構成されている場合

["document"] //Array literal, not a Property Accessor! 

はエラーを生成-will角括弧内の値が返されます。大域変数は通常、その1つの識別子だけで参照されます。これは、グローバル変数が識別子名を保持する文字列、またはその名前を構築した、または返す式を使用して参照される可能性から除外しているように見えます。しかし、javascriptのグローバル変数(およびそれに関するグローバル関数名)は、グローバルオブジェクトのプロパティです。グローバルオブジェクトへの参照を保持する識別子は、大括弧の左側に使用して、グローバル変数を参照するプロパティアクセサを形成することができます。

グローバルなオブジェクトは、スクリプトが実行されているウィンドウ(またはフレーム)です。各ウィンドウ(またはフレーム)オブジェクトには多数のプロパティがあり、少なくとも2つはウィンドウ(グローバルオブジェクト)自体への参照です。これらのプロパティは 'window'と 'self'です。これらのプロパティー名は、大域変数を参照するときに、大括弧の左側の識別子として使用できます。他の用途と同様に

ウィンドウ[ "anyName"]

- :グローバル変数として参照することができる

var anyName = 0; 
  • - :ように定義されたグローバル変数所与角括弧の表記法のうち、角括弧内の文字列は変数に保持するか、式で構築/返すことができます。

    グローバル関数内で実行されているコード、グローバル関数内のコード(newキーワードで呼び出されたオブジェクトコンストラクタを除く)、および関数外のインラインコードもthisキーワードを使用してグローバルオブジェクトを参照できます。このキーワードは、実行コンテキストに応じてオブジェクトを参照します。グローバルコンテキストで実行されるコードの場合、これはグローバルオブジェクト(Webブラウザではウィンドウオブジェクト)です。結果として、上記の変数はthis ["anyName"]と呼ばれることができますが、グローバルコンテキストで実行されているコードでのみ参照できます。

    しかし、このキーワードを使用すると、特にカスタムJavaScriptオブジェクトを含むスクリプト(これらのオブジェクトのメソッド(およびコンストラクタ)がこれを使用して独自のオブジェクトインスタンスを参照する)で混乱する可能性が高くなります。

    一部のJavaScript実装には、グローバルオブジェクトを参照するグローバルオブジェクトのプロパティがありません。このキーワードを使用してグローバル変数にアクセスしようとするのではなく、グローバルオブジェクトを参照する独自のグローバル変数を作成することができます。スクリプトの開始時にインラインコードとして実行

    var myGlobal = this; 
    
    • グローバルオブジェクト(このそのコンテキストで)への参照を割り当てます。それ以来、すべてのグローバル変数は、角括弧表記で参照できます。 -

      myGlobal ["anyName"];

    • となり、myGlobalは、実行コンテキストのグローバルオブジェクトを参照することを期待します。

14
b = "bar" + ["foo"] 

これは文法的に正しいですが、確かに非常に、非常に、余計。

"bar" + ["foo"] 
使用されている +

、との1:

["foo"] 

JavaScriptは、「foo」を文字列「foo」をとり、一つの要素を持つ配列に変換:それがどのように動作するかですoperandsは文字列、この場合は "bar"で、JavaScriptは2番目の文字列を文字列に変換します。オペランド2は配列なので、Array.toStringメソッドが呼び出されます。デフォルトでは、コンマで結合されたすべての要素が返されます。 1つの要素があり、結果はこの要素と同じになります。つまり、このコンテキストでは"foo"["foo"]に相当します。

あなたがArray.toStringを再定義する場合は、何が起こっているのか良くわかります。

alert("bar" + ["foo"]) 
Array.prototype.toString = function() { return "???"; } 
alert("bar" + ["foo"]) 
9

私は誰かが人と言わ賭ける:

  • は、「アレイで文字列の連結を行い、それは高速です!」

意味:

var some_variable = ['to=', other_variable].join(""); 

そのコードはおそらく、とにかく一度だけ実行されるように、連結をたくさんのために明らかに高速ですが、全く無関係。 Premature_optimization = sqrt(all_evil)

と貧しいやつは、他の無関係なことをした...

私は人々を愛しています。

var some_variable = 'to=' + other_variable; 

と、この:

var some_variable = 'to=' + [other_variable]; 

異なる結果を生成

9

これは状況を構築することが可能です。具体的には、Array.prototype.toString()メソッド(または、Array.prototype.join()メソッド)がデフォルトから変更されていると、何かが起こる可能性があります。たとえば、ログ情報を生成したり、ルックアップなどを行うために、特別な機能をArray.prototype.toString()メソッドに追加することができます。

これが実行された可能性はスリムで、私は想像していますが、完全性のために言及する必要があります。

28

でもアレイのプロトタイプを変更せずに違いがあります:other_variableが定義されていない場合

var other_variable; 
var some_variable = 'to=' + [other_variable]; 

は、配列との戻り値は「=」にある、

戻り値が 'されたアレイなしto =未定義です。私がいたように...今日で

、(誰か他の人のJavaScriptで見られる)[角括弧]を含むいくつかの奇妙な/新しい構文はおそらくかもしれない何かを見つけるためにしようとしているときに誰がここに到着した念のために

4

、 ES6では配列の構造を解消するために左辺に[]を使用しています。

const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names; 
console.log(first); // 'Luke' 
const [first, second] = names; 
console.log(first, second); // 'Luke' 'Eva' 

詳細については、http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/またはgoogle 'es6 destructuring'を参照してください。