ハッシュマップは通常、JavaScriptでキー価値ペアを保存する簡単な場所として使用されます。ただし、オブジェクトは真のハッシュマップではなく、不適切に使用すると問題を引き起こす可能性があります。また、JavaScriptはローカルハッシュマッピングを提供できない場合があります(少なくともクロスブラウザー互換性はありません)、オブジェクトのプロパティを宣言するより良い方法があります。
ハッシュマップの簡単な実装:
var hashmap = {set:function(key、value){this [key] = value}、get:function(key){return this [key]}、contains:function(key){return this.get(key)== null?false:true}、削除:function(key){delete this [key]}}}}使用例:
hashmap.set( "name"、 "John Smith"); hashmap.set( "age"、24); Hashmap.get( "name"); // John Smith Hashmap.Contains( "Title"); // false hashmap.contains( "name"); // true hashmap.remove( "age");
メンバーを宣言するオブジェクトの問題
この問題は、オブジェクトプロトタイプチェーンの継承メカニズムによる可能性があります。例として、ToStringメソッドを取ります。 Objectが存在するかどうかを判断するためにIn演算子を使用している場合:
var map = {}; 'tostring' in map; // 真実オペレーターは、オブジェクトがすべてのプロトタイプから存在するかどうかを探すためです。この問題を解決するために、HasownPropertyメソッドを使用して、オブジェクトが存在するかどうかを検出できます。
var map = {}; map.hasownproperty( 'toString'); // 間違いこの方法は非常にうまく機能しますが、HasownPropertyプロパティを定義する場合、面倒かもしれません。
var map = {}; map.hasownproperty = 'foo'; map.hasownproperty( 'hasownproperty'); // typeRrorこれに対する簡単な修正は、ネイティブオブジェクトを使用することです。
var map = {}; map.hasownproperty = 'foo'; {}。hasownproperty.call(map、 'hasownproperty'); // 真実この方法は問題を引き起こしません。オブジェクト内のプロパティが存在するかどうかを判断するたびに、プロトタイプチェーンのメソッドを除外する必要があります。
var map = {}; var has = {} .hasownproperty; for(var key in map){if(has.call(map、key)){//何か}}}裸のオブジェクト
実際のハッシュマップを作成するトリックは、すべてのプロトタイプオブジェクトを解決することです。 Object.createを介してこの効果を達成できます
var obj = {}; //は次のことに相当します:var obj = object.create(object.prototype);さらに、この方法により、プロトタイプを完全に放棄し、nullを直接使用して継承することができます。
var map = object.create(null); map instanceof object; // falseobject.prototype.isprototypeof(map); // falseObject.getPrototypeof(Map); // null
これらの裸のオブジェクト(または辞書)は、HASPマップとして理想的です。競合がないため、エラーを引き起こすなど、あらゆるタイプの変換に抵抗します。
var map = object.create(null); map + ""; // typeRerr:オブジェクトをプリミティブ値に変換できません
ここには予約済みの単語はありません。たとえば、ハッシュマップ用に設計されています。
var map = object.create(null); 'tostring' in map; // 間違いさらに進むと、...ループがより簡単になったため、このようなループを書くだけです。
var map = object.create(null); for(map in map){//何かをする}これらの違いは別として、一般的なオブジェクトキーと値ストレージと違いはありません。オブジェクトは、シリアル化され、プロトタイプと宣言され、継承され、コンテキスト変数の使用は同じです。
var map = object.create(null); object.defineProperties(map、{'foo':{value:1、列挙可能:true}、 'bar':{value:2、列挙可能:false}}); map.foo; // 1map ['bar']; // 2json.Stringify(Map); // {"foo":1} {}。hasownproperty.call(map、 'foo'); // true {}。propertyisenumerable.call(map、 'bar'); // 間違い上記の可変検出方法でさえも適用されます。
var map = object.create(null); typeof map; // object {}。toString.call(map); // [object object] {}。valueof.call(map); // 物体 {}