해시 맵은 일반적으로 JavaScript에서 키 값 쌍을 저장하기위한 간단한 장소로 사용됩니다. 그러나 객체는 실제 해시 맵이 아니며 부적절하게 사용하면 문제를 일으킬 수 있습니다. JavaScript는 로컬 해외 매핑을 제공하지 않을 수 있으며 (적어도 크로스 브라우저 호환되지 않음) 개체 속성을 선언하는 더 좋은 방법이 있습니다.
해시 맵의 간단한 구현 :
var hashmap = {set : function (key, value) {this [key] = value}, get : function (key) {return this [key]}, cotains : function (key) {return this.get == null? false}, 제거 : function (key) {key (key) {this [key]}}사용의 예 :
Hashmap.set ( "이름", "John Smith"); hashmap.set ( "Age", 24); hashmap.get ( "name"); // John Smith Hashmap.contains ( "title"); // false hashmap.contains ( "name"); // true hashmap.remove ( "age");
회원 선언 대상 문제
이 문제는 객체 프로토 타입 체인의 상속 메커니즘 때문일 수 있습니다. Tostring 방법을 예로 들어보십시오. IN 연산자가 객체가 존재하는지 여부를 결정하는 데 사용되는 경우
var map = {}; 'Tostring'지도; // 진실IN 연산자는 객체가 모든 프로토 타입에서 존재하는지 여부를 찾을 것이기 때문입니다. 이 문제를 해결하기 위해 HasownProperty 메소드를 사용하여 객체가 존재하는지 여부를 감지 할 수 있습니다.
var map = {}; map.hasownproperty ( 'tostring'); // 거짓이 방법은 매우 잘 작동하지만 HasownProperty 속성을 정의하면 문제가 될 수 있습니다.
var map = {}; map.hasownProperty = 'foo'; map.hasownproperty ( 'hasownproperty'); // TypeError이것에 대한 빠른 해결책은 기본 객체를 사용하는 것입니다.
var map = {}; map.hasOwnProperty = 'foo'; {}. // 진실이 방법은 문제를 일으키지 않습니다. 객체의 속성이 존재하는지 판단 할 때마다 프로토 타입 체인의 메소드를 필터링해야합니다.
var map = {}; var has = {} .HasOwnProperty; for (var key in map) {if (has.call (map, key)) {// something}}벌거 벗은 물체
실제 해시 맵을 만드는 요령은 모든 프로토 타입 객체를 해결하는 것입니다. 우리는 Object.create를 통해이 효과를 달성 할 수 있습니다
var obj = {}; //는 다음과 같습니다. var obj = object.create (Object.Prototype);또한이 방법을 사용하면 프로토 타입을 완전히 포기하고 NULL을 사용하여 상속받을 수 있습니다.
var map = object.create (null); 맵 인스턴스 객체; // falseObject.prototype.isprototypof (map); // falseObject.getPrototype (map); // 널
이 알몸 물체 (또는 사전)는 HASP 맵으로 이상적입니다. 충돌이 없기 때문에 오류가 발생하는 것과 같은 유형 변환에 저항합니다.
var map = object.create (null); map + ""; // TypeError : 객체를 원시 값으로 변환 할 수 없습니다
예약 단어가 없으며 예를 들어 해시 맵을 위해 설계되었습니다.
var map = 객체. // 거짓더 나아가서, ... 루프에서 더 간단 해졌으므로, 우리는 이와 같은 루프를 작성하면됩니다.
var map = 객체.
이러한 차이점과는 별도로 일반 객체 키 값 저장소와 다르지 않습니다. 객체는 직렬화, 선언 된 프로토 타입 및 상속 될 수 있으며 컨텍스트 변수의 사용은 동일합니다.
var map = 객체. // 1map [ 'bar']; // 2json.stringify (지도); // { "foo": 1} {}. hasownProperty.call (지도, 'foo'); // true {}. propertyisenumerable.call (지도, 'bar'); // 거짓위에서 언급 한 가변 감지 방법조차도 적용 할 수 있습니다.
var map = object.create (null); 맵 유형; // Object {}. TOSTRING.CALL (MAP); // [Object Object] {}. valueOf.call (map); // 물체 {}