1

この質問は実際には別の質問の結果であり、私はいくつかの実験を行いましたが、結果は私をさらに混乱させます。私は実際に内部で何が起こっているのかを説明する答えを期待しています。

私が試したことは、

ここで明確な説明を得たので 、これを基本的な仮定として維持しました。

var a = [];
a['a1'] = [];
a['a2'] = [];

console.log(a); // []
console.log(a['a1']); // []
console.log(a['a2']); // []

テスト1

b[0]これは、プロパティとして出力され、プロパティaにアクセスできるため、非常に混乱しました。文字配列として扱うことができると考えたため、別の値を割り当てようとしましたが、成功しませんでした。基本的な仮定から、これをchar配列(より一般的には配列)として扱うことができれば、割り当ては成功しているはずです。それは基本的な仮定を破ります。lengthvar b

var b = 'abcd';
b['b1'] = [];

console.log(b); // abcd
console.log(b.length); // 4
console.log(b['b1']); // undefined

テスト2

しかし、私がこのように作成すると、割り当てが発生します、

var bb = ['a', 'b', 'c', 'd'];
bb[4] = [];

console.log(bb); // ["a", "b", "c", "d", []]
console.log(bb.length); // 4
console.log(bb[0]); // a
console.log(bb[4]); // []

b[4] = [];このことから、成功するかもしれないと思いましたが、

var b = 'abcd';
b[4] = [];

console.log(b); // abcd
console.log(b.length); // 4
console.log(b[4]); // undefined

私の質問は、変数がいくつかの共通の機能を共有しているのに、なぜこれらの割り当ての動作が異なるのかということです。

これがデモです

誰かが私に実際に内部で起こっていることについて明確な説明をしてくれませんか?

追加のテスト

次に、数値割り当てを試してみると、これら2つとはまったく異なる動作をします。

var c = 1234;
c[4] = [];

console.log(c); //1234
console.log(c.length); // undefined
console.log(c[0]); //undefined
console.log(c[4]); //undefined   
4

4 に答える 4

1

でオブジェクト以外にアクセスすると、正しいプロトタイプ (または など) で[]インスタンス化された一時オブジェクトが提供されます。他のオブジェクトと同じように、このオブジェクトのプロパティを読み書きできます。たとえば、試してみてください。ただし、このオブジェクトはどこにも参照されていないため、インデックスを作成した直後にガベージに移動し、次に設定した同じプロパティを読み取ろうとすると、実際には新しい一時オブジェクトのプロパティにアクセスしています。当然、空です。StringNumberalert(3["constructor"])

于 2012-08-15T16:32:48.207 に答える
1

テスト 1: b内部的には配列ではなく文字列であるため、b位置に何かを割り当てることはできません。

テスト 2:bbは配列なので、もちろん動作します。

私の質問は、変数がいくつかの共通の機能を共有しているのに、これらの割り当てが異なる動作をするのはなぜですか?

種類が違うからです。

テスト 3: cは数値であり、配列ではありません。

文字列がヌル文字 ( ) で終了する char 配列である C のバックグラウンドがあるかもしれません\0。JavaScript では、文字列は組み込みの int 型であり、配列とは異なる動作をします。ジョナサンが言ったように、[]演算子は1つの特定の文字にアクセスするのに便利です。ここにいくつかのリンクがあります。

于 2012-08-15T16:25:17.763 に答える
0

推論

あなたの「基本仮定」aは配列であるため機能します。「テスト 2」は、配列を使用して作成した唯一の他のテスト ケースです。これが、機能する唯一の他のテスト ケースである理由です。

length角括弧表記を提供し、メソッドを持つことは、オブジェクトが配列であることを示していると想定しているようです。本当じゃない。オブジェクトが配列かどうかをテストするには、instanceof次のように JavaScript のメソッドを使用できます。

var a = [];
var b = 'abcd';
var bb = ['a', 'b', 'c', 'd'];
var c = 1234;

a  instanceof Array // => true
b  instanceof Array // => false
bb instanceof Array // => true
c  instanceof Array // => false

配列操作を実行しようとしているため、instanceof Array戻り値のケースは期待どおりに動作していることに注意してください。true


「テスト 1」が失敗した理由

「テスト 1」では、文字列の角括弧表記が文字列クラスのcharAt機能を実行します。を考えるとb = 'abcd'実行することは実行b[0]することと同じb.charAt(0)です。これは読み取り専用で、単純にそのインデックスの文字「a」を返します。

詳細については、文字列に関する Mozilla Developer Network のドキュメントを参照してください。


「追加テスト」が失敗した理由

「追加テスト」では、整数は角括弧表記または長さメソッドを提供しないため、これらの呼び出しはすべて失敗しました。

于 2012-08-15T16:25:37.383 に答える
0

私はあなたの質問が何であるかに従っていないと思います。Javascript では、文字列、配列、および整数の扱いが異なります。それらが同じように動作するとは思わないでください。また、最初の例が機能する場所へのJavaScriptの連想配列などはありません。表記のa['a1']タイプは、実際にはオブジェクト プロパティにアクセスするための代替手段にすぎず、文字列のコンテキストでは意味がありません。

于 2012-08-15T16:27:15.147 に答える