2

Crockford はhttp://javascript.crockford.com/survey.htmlに次のように書いて

ます



したがって、私が読んでいるAJAXコードの次の2行に混乱しています。

var obj={};    // obj is an Object object (i.e. a hash table)
obj[4] = 'x';  // now obj is suddenly an Array object via an integer key?

JavaScript では、オブジェクトと配列はまったく同じものですが、キーの型に違いがありますか?

つまり、ハッシュキーに名前 (文字列) または整数のいずれかを使用できる php と同じでしょうか?

これに関する回答をグーグルで検索しましたが、この問題について説明している記事を突き止めることができないようです。

考えられる可能性としては、最初の行が構文リントである可能性があります。これは、新しい Array オブジェクトを作成するときに、2 行目が obj の以前の定義を上書きするためです。

4

5 に答える 5

1

配列にはなりません。次のように、「4」プロパティを持つ単純なオブジェクトです。

var obj = {
  '4': 'x'
};

次のようなプロパティとして使用すると、文字列に変換されるだけですobj['4'] = 'x';

于 2012-08-29T20:58:45.967 に答える
1

JavaScript では、プリミティブ データ型以外はすべてオブジェクトです。オブジェクトはプロパティを持つことができ、オブジェクト プロパティにアクセスするには 2 つの方法があります。

  1. foo.barプロパティ名が有効な識別子である限り、ドット表記法を使用できます。

  2. キーが有効な識別子[spec]foo['bar']でない場合に使用する必要があるブラケット表記。たとえば、それが数値であるか、スペースが含まれているか、名前の付いた変数がある場合です。

したがって、括弧表記は配列の特徴ではなく、表示されたとしても、値が配列であることを意味するわけではありません。プロパティにアクセスする 2 つの方法のうちの 1 つです。

配列の要素は、数値キーを持つ単なるプロパティです。配列はオブジェクトの上に構築され、これらの数値プロパティを特別な方法で処理するいくつかの追加メソッドを実装します。たとえば、.length新しい要素を追加すると、プロパティは自動的に更新されます。しかし、最終的には、それらは単なる通常のプロパティです。

あなたの例では、単純なオブジェクトがあります。は有効な識別子ではobj[4]ないobj['4']ため、プロパティにアクセスする必要があります (基本的に、変数名として使用できるものはすべて有効な識別子です。無効です)。obj.44var 4 = 'foo';

また、配列は単なるオブジェクトであるため、数値を識別子として使用できればで要素にアクセスすることもできましたarr.4

于 2012-08-29T21:00:46.393 に答える
0

Javascript は、緩やかに型付けされたプロトタイプベースの言語です。ブール値のようなプリミティブ型でさえ、オブジェクトのように扱うことができます (ただし、遠くまでは行きません)。JavaScript のほとんどすべては、ルートではオブジェクトです。

これを理解すると、配列はオブジェクトです。プロパティを任意のオブジェクトに追加できます。

var xml = new XMLHttpRequest();
xml[4] = 'x';
console.log(xml);

そのオブジェクトは依然として XMLHttpRequest のインスタンスです。4の値でラベル付けされたプロパティがありますx。このように何でも扱うことができます -- 関数であっても:

var test_func = function () {
    alert('woah!');
}
test_func[4] = 'x';
console.log(test_func[4]);

ここでのobj[key] = value注意点は、PHP などの言語のように、この表記が「配列」型を示しているわけではないということです。むしろ、任意のオブジェクトのプロパティにアクセスする別の方法であり、(無効な構文であるobj.key = valueため使用できません) と同等です。obj.4 = 'x'もう 1 つのポイントは、javascript のオブジェクトは、ほぼすべての方法で変更または使用できるということです。オブジェクトを誤用してはいけませんが、できます

ここでチェックしてください:http://jsfiddle.net/w2AqJ/

ドキュメンテーション

于 2012-08-29T21:04:28.903 に答える
0

はい

Javascript 配列は従来の配列とは大きく異なり、オブジェクトと考えることができます。

 var array = [1,2,3] is equivalent to var object = {'0' : 1, '1' : 2, '2' : 3} 

Array.prototype から継承された配列と Object.prototype から継承されたオブジェクトを除き、Array.prototype には length などのメソッドが含まれます。

于 2012-08-29T21:05:50.653 に答える
0

私の知る限り、いいえ、オブジェクトを配列に強制することはできません。しかし、それは配列のように見え、機能する可能性があり、それがここで起こっていることです. 数値、および文字列に強制できるその他のものはすべて、Javascript オブジェクトの完全に有効なプロパティ名です。

obj[4] = 1;
obj['spam'] = 2;

どちらも、オブジェクトのプロパティを設定する有効な方法です。それはオブジェクトを配列にしません。配列は、特定のメソッド ( 、 など) と、配列内のアイテムの数によって最新の状態に保たれるプロパティを持つオブジェクトの特別な.slice()クラス.concat()ですlength

于 2012-08-29T20:58:44.307 に答える