web-dev-qa-db-ja.com

JavaScript配列の順序は保証されていますか?

JavaScript配列が(ajax/JQueryを使用して)フォームに投稿されると仮定すると、配列内の順序は保証されますか?

@Quentinからの有効な質問「「フォームに投稿」を定義する」

$.ajax({
  type: "POST",
  url: url,
  data: { foo: [{ name: "one" }, { name: "two" }] },
  success: success,
  dataType: dataType
});

(上記の理由で)質問を展開すると、配列はサーバー側で順序を保持することが保証されますか?

33
Dementic

疑わしい場合は、常にECMAScript標準を参照できます。 Array Exotic Objects

配列は、0から2 ^ 32の整数であるプロパティに対して長さプロパティがどのように処理されるかについて追加のセマンティックを持つ言語の特別な種類のオブジェクトです。 javascriptでは、0から除外されたlengthプロパティまでの範囲に欠損値がある場合、配列が疎になる可能性があります。さまざまな配列メソッドはこれを考慮に入れます。たとえば、 forEach 欠損値を無視します

欠損値とは何ですか?

この言語は、通常のオブジェクトに対して可能な限り配列を動作させようとします。任意のプロパティを追加したり、配列から継承するオブジェクトを追加したりすることもできます。

var fruits = ["Apple", "Banana"];
fruits.preferred = "Apple";

この種のコードは問題になりませんが、書き始めると:

fruits[100] = "Strawberry";
for(let i = 0; i < fruits.length; ++i) {
...
}

100は[0、2 ^ 32)の範囲のプロパティ名であるため、配列要素でもありますが、この時点でfruits.lengthはどうあるべきですか? 101でなければなりません。そうでない場合、forループは「Strawberry」を取得しません。

ただし、この時点では、定義されていない要素[2、99]の範囲があることを受け入れる必要があります。これらは欠損値です。

逆に、lengthプロパティを変更する場合も同じである必要があります

var fruits = ["Apple", "Banana"];
fruits.length = 0;

現在、forループは配列の要素を取得しません。これは、fruits配列を空にすることと同じです。

長さをインクリメントすることも可能です。その結果、欠損値が発生します。

そのため、すべての要素を昇順で繰り返すことができるため、配列が順序付けられますが、欠損値が存在する可能性があることに注意してください

34
Nicola Bizzoca