89

javascriptで私はこのような配列を定義します

var arr = [1,2,3];

また、私はすることができます

arr[-1] = 4;

今私がするなら

arr = undefined;

また、 arr[-1]の値への参照を失います。

したがって、論理的には、arr[-1]もarrの一部であるように見えます。

しかし、私がフォローするとき(arrをundefinedに設定せずに)

arr.length;

4ではなく3を返します。

したがって、私のポイントは、配列を負のインデックスで使用できる場合、これらの負のインデックスもその長さの一部である必要があるということです**。自分が間違っているのか、配列に関する概念が欠けているのかはわかりません。

4

8 に答える 8

119

したがって、論理的には、arr[-1]もarrの一部であるように見えます。

はい、そうですが、あなたが思っている方法ではありません。

配列に任意のプロパティを割り当てることができます(JavaScriptの他のオブジェクトと同じように)。これは、配列を「インデックス付け」し-1て値を割り当てるときに行うことです。これは配列のメンバーではなく、単なる任意のプロパティであるため、lengthそのプロパティを考慮することを期待しないでください。

つまり、次のコードは同じことを行います。

​var arr = [1, 2, 3];

​arr.cookies = 4;

alert(arr.length) // 3;
于 2012-11-29T04:01:29.973 に答える
26

プロパティは、割り当てられた最高の「インデックス」より1つ大きい数値を返します。lengthここで、配列の「インデックス」はゼロ以上の整数です。JSでは「スパース」配列が許可されていることに注意してください。

var someArray = [];
someArray[10] = "whatever";
console.log(someArray.length); // "11"

もちろん、要素がない場合lengthはです0。最上位の要素を削除するためにlength使用した場合、は更新されないことにも注意してください。delete

ただし、配列はオブジェクトであるため、負の数や分数など、他の任意のプロパティ名を使用してプロパティを割り当てることができます。

someArray[-1] = "A property";
someArray[3.1415] = "Vaguely Pi";
someArray["test"] = "Whatever";

のような番号を指定した場合でも、舞台裏でJSはプロパティ名を文字列に変換することに注意してください-1。(正の整数インデックスも文字列になります。)

.pop()、などの配列メソッドは.slice()、0以上の整数の「インデックス」でのみ機能し、他のプロパティでは機能しないためlength、その点で一貫性があります。

于 2012-11-29T04:09:05.153 に答える
8

位置(または0)インデックスを使用する場合、値は配列内に配置されることに注意してください。

var array = [];

array[0] = "Foo";
array[1] = "Bar";

// Result: ["Foo", "Bar"]
// Length: 2

これは、インデックス以外の値(0-9 +ではない)を追加する場合には当てはまりません。

var array = [];

array[0]  = "Foo";
array[1]  = "Bar";
array[-1] = "Fizzbuzz"; // Not a proper array index - kill it

// Result: ["Foo", "Bar"]
// Length: 2

ルールに従ってプレイする場合にのみ、値が配列に配置されます。そうしないと、受け入れられません。ただし、これらはArrayオブジェクト自体で受け入れられます。これは、JavaScriptのほぼすべての場合に当てはまります。配列内の唯一の値です["Foo", "Bar"]が、アクセスできます"Fizzbuzz"

array[-1]; // "Fizzbuzz"

ただし、「インデックス」が無効であるため、これは配列値の一部ではないことに注意してください。代わりに、別のメンバーとして配列に追加されました。同じ方法で他の配列メンバーにアクセスできます。

array["pop"]; // function pop() { [native code] }

ここではpop、配列のメソッドにアクセスしていることに注意してください。これにより、ネイティブコードが含まれていることが通知されます。「pop」のキーを使用して配列値にアクセスするのではなく、配列オブジェクト自体のメンバーにアクセスします。オブジェクトのパブリックメンバーを循環することで、これをさらに確認できます。

for (var prop in array) 
    console.log(prop, array[prop]);

これは以下を吐き出します:

 0 Foo
 1 Bar
-1 Fizzbuzz

繰り返しになりますが、これはオブジェクト上にありますが、配列内にはありません。

素晴らしい質問です!確かにダブルテイクをさせてくれました。

于 2012-11-29T04:16:42.930 に答える
5

本当に負のインデックスやその他のインデックスを長さに含めたい場合は、自分で機能を作成してください。

function getExtendedArray() {
    var a = [];

    Object.defineProperty(a, 'totalLength', { 
        get : function() { return Object.keys(a).length; }
    });

    return a;
}

次に、たとえば:

var myArray = getExtendedArray();
console.log(myArray.totalLength); // 0
myArray.push("asdf");
myArray[-2] = "some string";
myArray[1.7777] = "other string";
console.log(myArray.totalLength); // 3
于 2013-07-18T16:22:27.390 に答える
4

JavaScriptの配列は実際にはオブジェクトです。それらは、配列コンストラクターから単純にプロトタイプ化されています。

配列インデックスは実際にはハッシュマップのキーであり、すべてのキーは文字列に変換されます。任意のキー(つまり「-1」)を作成できますが、Arrayのメソッドは配列のように機能するように調整されています。したがってlength、オブジェクトのサイズではなく、最大の整数インデックスよりも大きいことが保証されているだけです。同様に、印刷arrでは整数キー>=0の値のみが一覧表示されます。

詳細はこちら。

于 2012-11-29T04:05:42.737 に答える
4

配列は、JSの特別な種類のオブジェクトです。特別な構文があります。これは、それらを効果的に操作できるため、優れています。そのように配列リテラルを書くのがどれほど退屈であるか想像してみてください。

const array = {0: 'foo', 1: 'bar', 2: 'baz'} //etc...

しかし、それでもなおオブジェクトです。だからあなたがそうするなら:

const myArray = [42, 'foo', 'bar', 'baz'];

myArray[-1] = 'I am not here';
myArray['whatever'] = 'Hello World';

これらの非整数プロパティはオブジェクト(配列は)にアタッチされますが、のような一部のネイティブメソッドではアクセスできませんArray.length

ネイティブの「長さ」メソッドは、正の整数またはゼロに変換可能なすべてのプロパティ(およびインデックスプロパティであり、値は実際の)をカウントするゲッターであると想定できます。この疑似実装のようなもの:

仕様により、ネイティブlengthメソッド(ゲッター( )として)は、すべての「2 32exampleArray.length未満の非負の整数」キーをチェックし、最大のキーを取得して、その数値+1を返します。

セッター( )としてexampleArray.length = 42、指定された長さが非負の整数キーの実際の数よりも大きい場合、「欠落している」インデックス用の空のスロットを作成するか、または以下のすべての非負の整数キー(およびそれらの値)を削除します。与えられた長さ。

疑似実装:

const myArray = {
  '-1': 'I am not here', // I have to use apostrophes to avoid syntax error
  0: 42,
  1: 'foo',
  2: 'bar',
  3: 'baz',
  whatever: 'Hello World',

  get myLength() {
    let highestIndex = -1;
    for (let key in this) {
      let toInt = parseInt(key, 10);
      if (!Number.isNaN(toInt) && toInt > -1) {
        // If you're not an integer, that's not your business! Back off!
        if (toInt > highestIndex) highestIndex = toInt;
      }
    }
    return highestIndex + 1;
  },
  set myLength(newLength) {
    /* This setter would either:
      1) create some empty slots for 'missing' indices if the given length is greater than the actual number of non-negative-integer keys
      2) delete all non-negative-integer keys (and their values) which are not greater then the given length.
    */
  }
}

console.log(myArray.myLength); // 4

myArray[9] = 'foobar';

console.log(myArray.myLength); // 10

于 2018-11-05T11:36:15.990 に答える
1

MDNによると:

長さプロパティの値は、正の符号と2の32乗(232)未満の値を持つ整数です。

Javascriptでは、作成する任意のオブジェクトにプロパティを設定できます。

var array = new Array();
array = [1,2,3];
array["boom"] = "pow";

同様に、負のインデックスを設定すると、インデックスの一部ではなく、配列のプロパティとして格納されます。

array[-1] = "property does not add to array length";

これが、長さがそれを反映していないのに、for..inループがそれを示している理由です。

于 2012-11-29T04:25:42.400 に答える
-1

非正または非数値のインデックスを使用すると、配列はキーと値のペアを持つ連想配列として動作します。

配列を反復処理するには、次を使用できます

for(var index in myArray) {
  document.write( index + " : " + myArray[index] + "<br />");
}
于 2012-11-29T04:06:37.333 に答える