40

つまり、次のコードはどのようになりますか。

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");

さまざまな要素を設定するだけで、長さの「5」を出力しますか?

このコードの「問題」は、またはメソッドlengthを呼び出さないとどのように変化するかがわからないことです。私が次のいずれかを行うとき:getLength()setLength()

a.length
a['length']
a.length = 4
a['length'] = 5

非配列オブジェクトでは、dict/連想配列のように動作します。配列オブジェクトでこれを行うと、特別な意味があります。JavaScriptのどのメカニズムがこれを可能にしますか?JavaScriptには、翻訳するある種のプロパティシステムがありますか

a.length
a['length']

「get」メソッドに

a.length = 4
a['length'] = 5

「set」メソッドに?

4

8 に答える 8

24

JavaScript ではすべてがオブジェクトです。の場合Arraylengthプロパティは配列のインデックス付きアイテムの内部ストレージ領域のサイズを返します。[]演算子は数値引数と文字列引数の両方で機能するため、混乱が生じる可能性があります。配列の場合、数値インデックスで使用すると、予想されるインデックス付きアイテムが返されます/設定されます。文字列で使用すると、配列オブジェクトの名前付きプロパティを返す/設定します。文字列が数値に対応しない限り、インデックス付きのアイテムを返します。これは、JavaScript 配列インデックスが暗黙的なtoString()呼び出しによって文字列に強制されるためです。率直に言って、これは、頭を悩ませて「JavaScript、これ、これが彼らがあなたを笑う理由です」と言う理由の 1 つにすぎません。

実際の基本的な表現は、ブラウザーによって異なる場合があります (または異なる場合があります)。それを操作するときに提供されるインターフェース以外には何も依存しません。

JavaScript 配列の詳細については、 MDN を参照してください。

于 2008-12-14T00:41:12.447 に答える
4

これは、実際に何をするつもりかによって異なります。

[].length「魔法」です。
実際には、配列内のアイテムの数は返されません。配列内の最大のインステート インデックスを返します。

var testArr = [];  testArr[5000] = "something";  testArr.length; // 5001

しかし、セッターの背後にあるメソッドはエンジン自体に隠されています。
一部のブラウザーの一部のエンジンでは、これらの魔法のメソッドの実装にアクセスできます。他の人はすべてを完全にロックダウンします。

そのため、defineGetter メソッドと defineSetter メソッド、さらには実際には__proto__メソッドに依存しないでください。ただし、ターゲットにしているブラウザーとそうでないブラウザーがわかっている場合を除きます。

これは将来変更され、ECMAScript Next/6 で記述されたオプトイン アプリケーションがより多くの機能にアクセスできるようになります。

ECMAScript 5 準拠のブラウザーは、オブジェクト内の魔法のメソッドを提供getし始めておりset、さらに多くのメソッドが登場します... ...しかし、古い IE や大量のスマートフォンなどのサポートをダンプできるようになるまでには、おそらくしばらく時間がかかります...

于 2012-07-22T23:11:51.683 に答える
2

sup['look'] = 4;その場合、連想配列を使用するのではなく、 object のプロパティを変更することを知っておくことが重要ですsup

sup.look = 4;これは、いつでも JavaScript オブジェクトに動的にプロパティを追加できるため、同等です。sup['length']最初の例では、インスタンス出力 5 になります。

于 2008-12-14T00:35:41.350 に答える
2

tvanfossonの回答に追加するには:ECMA-262(3.0仕様だと思います)では、配列はプロパティを設定するためにこの動作を持つと単純に定義されています(15.4.5.1を参照)。その根底にある一般的なメカニズムは (少なくとも現時点では) ありません。これが定義方法であり、JavaScript インタープリターがどのように動作する必要があるかです。

于 2008-12-14T04:07:20.797 に答える
1

Arrayオブジェクトは、、、、およびプロパティを から継承callerします。constructorlengthnameFunction.prototype

于 2008-12-14T01:17:56.910 に答える
0

JavaScript 配列は、他のオブジェクトと同じようにオブジェクトですが、JavaScript では特別な構文が使用されます。

arr[5] = "yo"

上記は構文糖衣です

arr.insert(5,"yo")

これは、通常のオブジェクトに何かを追加する方法です。arr.length の値を変更するのは、 insertメソッド内にあるものです。

ここで customArray タイプの実装を参照してください: http://jsfiddle.net/vfm3vkxy/4/

于 2015-03-21T00:26:46.677 に答える