4

JavaScript の配列インデックスは実際にはすべて文字列のようa[0]です。しかし同時に、配列には長さのプロパティがあります。整数キーの値を変更すると、自動的に更新されます。では、JavaScript はどのようにしてキーが整数であり、長さを変更する必要があることを認識しているのでしょうか? 私が行った場合:a['0']a[1.0]a[1]a['1.0']

var a = 4/2;
var b=8/4; 
var c = 2; 
var d= 1*2;

arr[2], arr[0+2], arr[1*2], arr[a], arr[b], arr[c], arr[d]同じものですか?

次のようなループで配列にアクセスすることがよくあります。

for (i=0; i<100; i++) {
  arr[i]=1;  // this is a[0],a[1] right?
  arr[i+0.0]=1;  // is this a[0] or a['0.0'] ?
}

これを書くと:

for (i=0.1; i<100; i+=0.1) {
  arr[i*10]=1;  // what does it do?  a[1] = 1, a[1.0]=1 or a[1.00000] = 1 ?
}

ループ内の割り当ては何をしますか?

4

3 に答える 3

4

まず、JavaScript (ES5) には「整数」というものはありません。JavaScript (ES5) には数値しかありません。

第 2 に、JavaScript では暗黙的な型キャストが数多く行われています。次に例を示します。

if(1=='1') console.log('very truthy');

double-equals を使用すると、「1」が数値にキャストされ、新しい値 (1) と 1 (true、1 == 1) が比較され、文字列がログに記録されます。 「非常に真実」。

トリプルイコールを使用すると、暗黙的な型キャストは行われません。

if(1==='1') console.log("this won't get logged");

トリプルイコールを使用すると、型キャストが発生しなくなります。

次に、配列の整数インデックスに値を追加すると、そのインデックスは指定した値で更新され、さらに長さも更新されます。

var a = [];
a[0] = 0
a[1] = 1; 
a[2.0] = 2;
//[undefined, 1, 2]

整数 (1.1) ではないインデックスを更新しようとすると、それが何であれ文字列に変換され (1.1 は '1.1' になります)、新しいカスタム プロパティが配列に追加され、値が設定されます。それ。配列のカスタム プロパティは、配列の長さに影響しません。

var a = [];
a[1.1] = 1.1;
a.prop = "property";
//[], empty array
console.log(a.prop, a['1.1']); //"property",1.1

カスタム プロパティを JS 配列に追加すると、オブジェクトが変更され、オブジェクト リテラルのように動作します。

したがって、ここの場合、配列っぽい/オブジェクトリテラルっぽいマッシュアップオブジェクトになります。注: カスタム プロパティを JS Number または String に追加する場合、それらはオブジェクト リテラルに変換されません。調査しているこの動作は、JS 配列に固有のものです。

于 2012-10-31T06:25:08.643 に答える
3

JavaScript 配列は実際には配列ではなく、配列のように動作させるプロトタイプ メソッドを持つ JavaScript オブジェクトです。 arr['one'] = 1有効な JavaScript です。

arr.length が機能する方法は、単純に配列のキーを見て、最大の数 (JavaScript は実際には整数を処理せず、浮動小数点のみ) を見つけ、その数値 + 1 を返すことです。

試す:

var arr = [];

arr.one = 1;
arr[8] = 1;
console.log(arr.length);
于 2012-10-31T06:08:53.280 に答える
1

Chrome の開発ツールをいじってみると、あなたの主張は正しくないと思います。見つけた:

arr[0] == arr[0.0] == ar[0.0000] == arr["0"]

しかし

arr[0] != arr["0.0"]
arr[0.0] != arr["0.0"]

したがって、配列が内部で行っていることは、指定.toString()したインデックスを呼び出し、それを実際のインデックスとして使用しているようです。ご了承ください:

(0).toString() == "0"
(0.0000).toString() == "0"
于 2012-10-31T06:16:02.077 に答える