3

私は次の配列を持っています:

var arr = [];
console.log(arr.length); //Output: 0

arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322

arr["1231321".toString()] = "abcd";
console.log(arr.length); //Output: 1231322

arr["a1231321"] = "abcd";
console.log(arr.length); //Output: 0

arr["1231321a"] = "abcd";
console.log(arr.length); //Output: 0

これがフィドルです:http://jsfiddle.net/HcrcR/

arr をvar arr = {};次に変更すると、機能します。

しかし、文字列キーを使用してもキーからデータをプッシュし始める理由は何ですか?

4

3 に答える 3

6

次の配列/ハッシュマップがあります。

これArrayは JavaScript 用語です。

var arr = [];
console.log(arr.length); //Output: 0

これは空の配列です。

arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322

プロパティが非常に大きい理由は、length常に+1最高のインデックスよりも大きいためです。文字列を使用したかどうかは問題ではありません。JavaScript では、Arrays とObjects のキーは常に文字列です。

この Array オブジェクトの長さプロパティはデータ プロパティであり、その値は、名前が配列インデックスであるすべての削除可能なプロパティの名前よりも数値的に常に大きくなります。

ソース

arr["1231321".toString()] = "abcd";
console.log(arr.length); //Output: 1231322

文字列を呼び出しtoString()ても何も起こりません (既に文字列になっています)。

arr["a1231321"] = "abcd";
console.log(arr.length); //Output: 0

Arrayまた、インデックスのように見えないにプロパティを設定すると予想されます。

arr["1231321a"] = "abcd";
console.log(arr.length); //Output: 0

上記を参照。数値を取得しようとする文字列の内部的な解析はありません。

arr をvar arr = {};次に変更すると、機能します。

これが、JavaScript でのオブジェクトの動作です。それらは、値への文字列キーのバケツにすぎません。

于 2013-03-04T22:10:21.687 に答える
4

Array != Object (or hashmap)JavaScriptで。したがって、整数インデックスではない配列に追加されたプロパティは影響しませんArray.length

長さが1231321であるという理由だけで、スペースの予約がないことに注意してください。これは、すべてのスペースが割り当てられることを意味するわけではなく、JavaScript配列は連続したメモリを使用する必要はなく、スパースの場合は使用しないことがよくあります。実際には、これらは最適化としてのみ連続しており、デフォルトの動作では、オブジェクトと同じようにハッシュマップです。

オブジェクトが持つすべてのキーを知る必要がある場合は、https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keysを使用する必要があります

ただし、両方の概念を混在させないでください。JSでは、配列(数値インデックス)またはオブジェクト(任意のインデックス)のいずれかを使用する必要があります。

あなたがするとき

arr["1231321"] = "abcd";

それはと同じです

arr[1231321] = "abcd";

lengthこれはアレイのに影響します。でも、

arr["1231321a"] = "abcd"

length新しい配列インデックス(新しいオブジェクトプロパティのみ)を作成せず、プロパティに影響を与えません

次のコマンドを次々に入力すると、質問の例が正しくないことに注意してください

arr = [];
arr["1231321"] = "abcd";
console.log(arr.length); //Output: 1231322
arr["a1231321"] = "abcd";
// Output: 1231322, should be the same as before, not undefined
console.log(arr.length); //Output: 1231322

http://jsfiddle.net/tWCa4/

于 2013-03-04T22:16:14.943 に答える
2

最初の 2 つの文字列は数値として解析できるため、インデックスとして使用できます。

整数として解析できないものを渡すと、配列はそれをエントリではなく配列のプロパティとしてアタッチします。

オブジェクトとして定義すると、オブジェクトとして機能し、すべてを文字列プロパティとして扱います。長さは常に、javascript の配列の最大値 + 1 として定義されます。

明確にするために

var x = [] 

Array入力を整数に解析して配列に追加しようとするnew を作成しますが、それ以外の場合はそれらをプロパティとして割り当てます。

var x = {}

これは順序付けられていないプロパティのセットとして機能し、カスタム定義x.length = yしない限り長さはありません。その場合、特別な意味を持たない別のプロパティになります。

于 2013-03-04T22:09:18.923 に答える