どのようなjavascriptの配列データエスクローエージェント
-
21-08-2019 - |
質問
すなわち、どのようなケースには、次のコード:
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/連想配列の型になります。私はこのarrayオブジェクトで特別な意味があります。どんな仕組みでJavaScriptでできることへの失業が生まれるのでしょうか。はjavascriptについて一部の物件タイプシステムを変換し
a.length
a['length']
入getおよび
a.length = 4
a['length'] = 5
で"設定"方法を教えてください。
解決
JavaScriptですべてが対象です。 Array
の場合には、length
性は、配列のインデックス付きアイテムの内部記憶領域のサイズを返します。混乱の中には、[]
演算子は、数値と文字列の引数の両方で動作することに遊びに来るかもしれません。配列の場合、あなたは数字のインデックスとそれを使用している場合、それは返す/予想索引付きアイテムを設定します。あなたは、文字列でそれを使用している場合は、それを返す/配列オブジェクトの名前付きプロパティを設定 - 文字列が数値に対応していない限り、それはインデックス付きのアイテムを返します。 JavaScriptの配列インデックスで暗黙のtoString()
呼び出しによって文字列に強制変換されているためです。率直に言って、これはあなたがあなたの頭に傷を付けと言いますそれらのもののひとつである以上、「彼らはあなたを笑う理由JavaScriptが、これは、これはある。」
実際の根本的な表現は、ブラウザ(またはそれがない場合もある)との間で異なっていてもよいです。私はそれを扱うとき供給されているインタフェース以外に依存しないでしょう。
あなたは MDNでJavascriptの配列についての詳細を調べることができますのます。
他のヒント
tvanfossonの答えに追加するには:ECMA-262では(3.0仕様、私は信じている)、配列は単にプロパティを(15.4.5.1を参照)を設定するため、この動作を持つものとして定義されています。 (少なくとも今のように)それを根底に何の一般的なメカニズムはありません - 。これは、それが定義されていますどれだけある、そしてどのようにJavaScriptの通訳が動作する必要があります。
これは本当にあなたがそれをどうするつもりかに依存します。
[].length
は "魔法" である。
それは実際には配列内の項目数を返しません。これは、配列内の最大instatedインデックスを返します。
var testArr = []; testArr[5000] = "something"; testArr.length; // 5000
しかし、セッターの背後にある方法は、エンジン自体の中に隠されている。
一部のブラウザでは、一部のエンジンは、あなたがそれらの魔法のメソッドの彼らの実装にアクセスできるようになります。
その他は完全にロックダウンされたすべてのものを維持します。
だから、defineGetterとdefineSetter方法に依存しない、あるいは、本当に、__proto__
方法は、あなたが知っている限り、あなたがターゲットとしている知っているブラウザいる、とあなたはどのではありません。
これはECMAScriptの次/ 6で書かれたオプトインのアプリケーションが複数にアクセスする必要があります将来的に変更されます。
、ECMAScriptの5準拠のブラウザではすでにget
を提供し、オブジェクト内の魔法のメソッドをset
し始めていると来てより多くのがあります... ...しかし、あなたはをoldIEやスマートフォンのトンの支援をダンプすることができます前に、それは離れている間、おそらくですエトセトラ...
あなたが行うときに連想配列を使用していないsup['look'] = 4;
のではなく、オブジェクトのsupのプロパティを変更することを知っておくことが重要です。あなたがいつでも動的にJavaScriptのオブジェクトのプロパティを追加することができますので、sup.look = 4;
と同等です。 sup['length']
あなたの最初の例では、インスタンス出力5の場合と。
あなたは、配列のようなアクセス権を持つオブジェクトを実装しようとしている場合は、アレイのMozilla DEVセンターの記事には偉大なリソースです。残念ながら、私は、配列の実装の深さの詳細を知らないが、詳細の多くは、その記事にあります。
Array
オブジェクトを継承し caller
, constructor
, length
, は、 name
物件からの Function.prototype
.
JavaScriptの配列は、他のオブジェクトのようなオブジェクトですが、JavaScriptはそれを特別な構文を与えます。
arr[5] = "yo"
上記
のためのシンタックスシュガーのですarr.insert(5,"yo")
これはあなたが通常のオブジェクトにコンテンツを追加する方法です。これは、内部のの挿入のarr.lengthの値を変更する方法
あるものですここでのCustomArrayタイプの私の実装を参照してください。 http://jsfiddle.net/vfm3vkxy/4/
は、JavaScriptにおけるプロパティは、基本的にゲッターとあなたの配列(または文字列または他の入力)のセッターの両方として機能することができます。
実際のところ、あなたはこの自分を試してみてください。
const test=[1,2,3,4,5]
test.length = 3
console.log(test) // [1,2,3]
test.length = 5
console.log(test) // guess what happens here!
私の知る限りでは、JSでの配列は正確に連想配列のように動作しないと、あなたはメモリに置かれた要素を持っています連続(あなたが混在オブジェクトの配列を持つことができることを考えると)可能性のように、JSエンジンに応じて、あなたは検討しています。
注意点として、私は少しはほとんどの投票答えは「すべてがJavaScriptでのオブジェクトであること」のオーバー簡素化神話(またはハーフ真実を)引き続き拡大していることに困惑しています。 それはまさに真実のではなく、そうでなければ、例えば、プリミティブを勉強することはありません。
これを実行してみます:
const pippi = "pippi"
pippi.cat = "cat"
console.log(pippi.cat) // will it work? Throw an error? Guess why again
スポイラー:文字列はあなただけがされていないプリミティブのプロパティにアクセスしようとしている以下のいずれかで、その後、2行目にその特定の操作のための使い捨てのオブジェクトにラップされます(String.prototype
でプレイしていない提供など)、あなたがundefined
を得るようにします。
特性のJavascriptの配列
- ダイナミック-配列をJavascriptできます。押し
- できる疎-用例配列[50000]=2;
- できる有用など配列=[1, 2, 3, 4, 5]
Javascriptでは、実行時アクセス方向にあるのか、あるいは配列する高密度または疎になります。なでしかできないだろう。すべての実装を使用ヒューリスティックにするかどうかを判断します配列の密度または疎になります。例えば、コードポイント2、を切り換えて表示することができるjavascriptのランタイムすることが疎配列の実装です。場合、配列はinitialised初期カウントすることを示すことがで緻密に配列になります。
が、実行していることを検出すると、配列が疎で実施する"と同様にオブジェクトです。なの維持に連続した配列は、キーと値地図構築されています。
詳し参考- https://www.quora.com/How-are-javascript-arrays-implemented-internally