2009-07-17 13 views
46

Javascriptでは、オブジェクトとハッシュの違いは何ですか?あなたはどのようにして相手を創造しますか?なぜあなたは気にしますか?次のコード例に違いはありますか?オブジェクトとハッシュの違いは?

var kid = { 
name: "juni", 
age: 1 
} 

そして:

var kid = new Object(); 
kid.name = "juni"; 
kid.age = 1; 

そして:

var kid = new Object(); 
kid["name"] = "juni"; 
kid["age"] = 1; 

あなたは、私が説明しなければならない他のコードの例を考えることができますか?

コアの質問です。オブジェクトとハッシュの違いは何ですか?

+1

...それがお役に立てば幸い)地図"。 – Peter

+0

良い点...実際のJavascript型をハッシュしていませんか? –

+7

JavaScriptにはハッシュ型のようなものはありません。 '{}'は 'Object'型の簡略初期化子です。 '[]'は 'Array'型の短い手始めの初期化子です。 – Blixt

答えて

48

ただ存在しません。それらの3つはすべて文字通り等しい。

+14

間違っているか、少なくとも単純すぎます。 「彼らの間に違いはありません」ということではありません。それらは実際にはすべて同じものなので、差の量は「0」ではなく「NaN」です。 –

+1

そして...ここでは、さまざまな 'isObject'実装が異なる答えを出すことができることを示しています。http://stackoverflow.com/questions/8511281/check-if-a-variable-is-an-object-in-javascript –

3

これらは同じです。

これらは互換的に使用できます。

4

サンプルに違いはありません。それらは名前付きプロパティを持つすべてのオブジェクトです。これらのプロパティを作成/参照するさまざまな方法を示したばかりです。

3

これはすべて同じだと思います。 3番目のバージョンは、動的プロパティ名とともに使用できます。最初のものは書き込むのが最短です。

13

これらは、異なる表記法システムであり、区別なく使用することができます。ブラケットシンタックス[ ]を使用するほうが魅力的な場面がたくさんあります。たとえば、変数を使用してオブジェクトを参照する場合があります。

var temp = "kid"; 
var obj = new Object(); 
obj[temp] = 5; // this is legal, and is equivalent to object.kid 
obj.temp = 5; // this references literally, object.temp 
2

これらは同じです。ちょうど[]new Array()が同じです。

JavaScriptのコアタイプの詳細については、MDC Core JavaScript 1.5 referenceをご覧ください。

あなたは{}new Object()と同じであることを証明したい場合:

Object.prototype.helloWorld = function() { alert('Foo!'); }; 
var a = new Object(); 
var b = {}; 
a.helloWorld(); 
b.helloWorld(); 

を!警告ACHTUNGSSEMENT !!!Objectタイプのプロパティーをprototypeプロダクションコードに割り当てないでください。グローバルな名前空間全体を汚染するでしょう。

0

実際には、JavaScriptには「ハッシュテーブル」または「ハッシュマップ」と呼ばれるものはありません。 JavaScriptのオブジェクトは、ハッシュ[JavaScriptのオブジェクトは単にキー/値のプロパティです]のように動作し、そのため混乱します。

4

実際、JavaScriptのすべてのオブジェクトはハッシュです。これはオブジェクトのプロパティとメソッドのハッシュです。実際、Javascriptのすべてはハッシュです(つまり、名前と値のペアのリスト)。

オブジェクトのメソッド、プロパティを呼び出すたびに、または変数を参照するたびに、内部ハッシュ検索を実行します。

+0

簡潔に言うと、JavaScriptのすべてのオブジェクトがハッシュではなく一般化されたマップです。 Java、C#などの言語では、マップは同種のデータに使用されますが、JavaScriptではマップのデータはちょうど異種です。 – lcn

5

JavaやC#などの他の言語では、ハッシュテーブル/ハッシュマップ内の任意のオブジェクト(文字列や数値だけでなく)をキーとして使用できます。これはJavaScriptでは当てはまりません。文字列に変換する。

var h = {}, k = {}; 
h[k] = "One"; 
alert(h[ "[object Object]" ]); // Alerts "One" 

あなたがjshashtableのようなものを使用することができ、その場合には、キーとして任意のオブジェクトを使用することが有用であり得ます。

免責事項:jshashtableを書きました。

1

技術的には同じです。コードを書くときには、myobject['someproprty' + 'somethingElseConcatenated]を簡単に行うことができます。ドット表記を使用するときには実行できません。myobject.somepropertyをすべて実行できます。

ECMAscriptの著者のDouglas Crockfordは、何らかの理由でvar a = new Object()の構文を使用しないことを提案しています。とにかく、興味があればプレゼンテーションを見てみる価値がある(最初のものはここにある)http://video.yahoo.com/watch/111593/1710507

1

すべてのエンジン(ブラウザ)は異なる実装ですが、パフォーマンスに基づいてクロムのV8を重視しますあなたがv8のガイドラインに従えば同様のパフォーマンスが向上する最新のブラウザーのほとんどで1年前にテストしたテスト)。

何それは基本的に起こることである:

  1. プロパティが追加され、その場で削除することができた上で動的オブジェクトを実装するには - ハッシュテーブルは、最も簡単な解決策である - しかし、通常のオブジェクトとしてそのように効率的ではないがspeedwise Javaで(ランダムアクセス...)。
  2. オブジェクトが通常のオブジェクト(特定の順序などで設定されたプロパティの最終セットを持つ)またはハッシュテーブルの場合、V8はいくつかの戦略に基づいて推測しようとしています。最初は、これは単純なオブジェクトであると仮定し、それぞれの新しいプロパティはオブジェクトの新しい構造の作成と、それに古いプロパティと新しいプロパティをコピーします。オブジェクトが「難しい」と分類されている場合、オブジェクトはハッシュテーブルに移動されます。
  3. v8があまりにも多くの "間違い"に気付くと、すべてがハッシュテーブルに移動するため、パフォーマンスが悪くなります(つまり、jsonで登録されたすべてのメンバーや構造を初期化するコンストラクタを使用したいのですが...)
https://developers.google.com/v8/design#prop_access

www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1

jayconrod.com:

すると、このリンクを参照してください。/posts/52/a-tour-of-v8オブジェクトの表現

も非常に良い講演: https://www.youtube.com/watch?v=UJPdhx5zTaw

は、私はあなたの声明「の間とオブジェクトとハッシュ差は」「とオブジェクトと(ハッシュの違いを意味することを意図していると思う

関連する問題