2009-05-19 9 views
36

は、それがvar x = new Array();に問題があります。 JSLintで

var x = new Array(); 

が(それは本当の変数名ではありません)

var result = []; 

第一構文の何が問題になっていなければならないことを警告していますか?提案の背後にある理由は何ですか?

+2

第1構文で何も問題はありません。 2番目は単純に短くなります。 –

答えて

26

Crockford doesn't like new。したがって、可能であればJSLint expects you to avoid itnewを使用せずに新しい配列オブジェクトを作成することもできます。

+3

しかし、配列を開始しようとするとjslintが壊れますn値でたとえば、次のようになります。var x = new Array(20);この作成方法は頻繁には使用されませんが、そのケースがあり、ループを使用して配列を作成および移入するよりもはるかに高速です。 –

+3

n番目の要素をundefinedに設定するだけで、多かれ少なかれ同じことになります – mikelikespie

+7

宣言時に配列を特定のサイズに初期化する必要はありません。 JavaScript配列はC配列と似ていません。それらはオブジェクトであり、静的サイズの連続したメモリチャンクではありません。このため、必要に応じて配列に値を追加することができます。実際には、宣言時に初期化し、後で宣言時にn個のすべてのキーをハッシュしなければならないため、*値を代入すると再ハッシュしなければならない場合があります。 –

69

それはあなたが実際にJavaScriptでArrayの値を上書きすることができますので、new Array()を使用するよりも、それは[]を使用するほうが安全です。つまり

Array = function() { }; 

var x = new Array(); 
// x is now an Object instead of an Array. 

[]があいまいです。

+0

あなたは例を挙げることができますか? – TStamper

+0

良い点! Arrayをオーバーライドすると、Array.prototypeメソッドを引数のような配列のようなオブジェクトで使用しようとするコードで深刻な問題につながることに注意してください...それでも非常に悪い考えです。 – Shog9

+2

それだけでなく、Array()コンストラクターに渡す引数の数に応じていくつかの「奇妙な」振る舞いを持ちます。それはちょうど一般的に奇妙で、最も避けられる。 –

2

最初の構文そのものには何も問題はありません。実際には、w3schoolsには、配列を作成する方法としてnew Array()が記載されています。問題は、これが「古い方法」だということです。 「新しい方法」[]は短く、["foo", "bar"]のように配列の値を初期化することができます。ほとんどの開発者は、良いスタイルの点で[]new Array()を好んでいます。

+1

なぜこれが下落したのですか? –

+19

と思われます。なぜなら、w3.orgはw3.orgに関連付けられておらず、しばしば貧弱または不正確なコードを持っているからです。 –

+0

@AndrewAustin True。ウェブベースでは、一般的な経験則として、情報を取得した場所に関係なく、ソースをダブルチェックする必要があります。 – Tivie

4

形態のいずれかと間違って何もしていますが、通常はリテラルはどこpossible-

VAR S = '')(VAR S =新しい文字列よりも正しい以上ではありません使用を参照....

7

http://jsperf.com/new-array-vs-literal/11([1、.2] vs new Array(1、.2))リテラルはwayですが、これはあなたが使用していると異なるパフォーマンスを得ることができるようです。この状況ではより速い。

http://jsperf.com/new-array-vs-literal/7(新しい配列(500000)vs [] .length(500000))新しい配列はクロムv21の方が高速です(このテストでは約7%または30%)。

+4

+1科学! –

+1

+1ベンチマークは通常、物事を視点に置くのに役立ちます – Tivie

関連する問題