2017-10-23 9 views
3

実際、私は他人のコードを使って作業しています。数字と文字列で新しいArray()コンストラクタを作成する

バグを解決しているうちに、 のようなものが見つかりました。

注:APIはnumberNumber型でproductNumberを指定しています。

新しいArray()にproductNumberを1つだけ渡すことがあります。新しい バグが発生します。

また、複数の製品を入力すると、正常に動作します。

なぜarr1 [0]が未定義を与えているのですか?

var productNumber1 = 1001; 
 
var arr1 = new Array(productNumber1); 
 
console.log("arr1",arr1[0]); 
 

 
var productNumber2 = '1001'; 
 
var arr2 = new Array(productNumber2); 
 
console.log("arr2",arr2[0]);

誰かが、この動作を説明してもらえます。あなたは、配列の長さとして扱わなっパッシングCASE1引数で

答えて

4

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

A JavaScriptの配列を指定して要素で初期化された単一の引数が渡された場合を除きArrayのコンストラクタに渡します。その引数は数値です(下のarrayLengthパラメータを参照)。この特殊なケースは、Arrayコンストラクタで作成されたJavaScript配列にのみ適用され、ブラケット構文で作成された配列リテラルには適用されないことに注意してください。

にarrayLength

Arrayコンストラクタに渡される唯一の引数は、0から2^32-1(含む)の整数である場合、これはその番号(注にその長プロパティが設定された新しいJavaScriptの配列を返しますこれはarrayLengthの空のスロットの配列を意味し、実際の未定義の値を持つスロットではありません)。引数が他の数値の場合、RangeError例外がスローされます。

実際はケース1では、長さが1001の配列を作成しています。

しかし、ケース2では、数値ではないため、要素として扱われています。

+0

ほんの少しの修正:1のパラメータを渡すことはありませんが、代わりに* *引数。引数は決して変更されません。 –

+1

@GerardoFurtado Ahhはその混乱を避けました。 –

+0

"それ以外の数値はRangeError例外がスローされる"は、(productNumber <0 || productNumber> 2^32-1)は例外を生成することを意味します。 –

2

これはdocumentation for the Array constructorに記載されている:

Arrayコンストラクタに渡される唯一の引数が0と232-1(含む)の整数である場合、これは、その長さのプロパティが設定された新しいJavaScriptの配列を返しますその数

にあなたが1001のように番号を渡す場合は、長さを設定しますが、あなたは'1001'のような文字列を渡す場合は、最初の値を設定します、そしてあなたが複数の引数を渡す場合は、設定されます複数の値。


Arrayコンストラクタを使用しないでください。代わりに大括弧のリテラル表記を使用してください。これは問題を回避します。

var productNumber1 = 1001; 
 
var arr1 = [productNumber1]; 
 
console.log("arr1",arr1[0]); 
 

 
var productNumber2 = '1001'; 
 
var arr2 = [productNumber2]; 
 
console.log("arr2",arr2[0]);

+0

それは私のために働く。 –

1

はまた、このジョブのArray.of()ツールを使用することができます。

var p1 = 1001, 
 
    p2 = "1001", 
 
    a1 = Array.of(p1), 
 
    a2 = Array.of(p2); 
 

 
console.log(a1); 
 
console.log(a2);

+1

私の質問の良い解決策。 Array.of()はes6の一部です。 –

関連する問題