>  기사  >  웹 프론트엔드  >  JS HashMap 분석_javascript 기술을 구현하기 위해 toString 오버로드

JS HashMap 분석_javascript 기술을 구현하기 위해 toString 오버로드

WBOY
WBOY원래의
2016-05-16 18:09:251696검색

그러나 주의 깊게 비교해 보면 그 차이가 여전히 매우 크다는 것을 알 수 있습니다. Java HashMap의 키는 Object 유형이므로 모든 유형의 매개변수를 사용할 수 있지만 JS의 키는 문자열 또는 숫자만 사용할 수 있습니다. obj={};map[obj]=1;이라고 말할 수 있습니다. 이 코드는 숫자도 문자도 아닌 키를 전달하지만 오류는 발생하지 않습니다. 이는 인터프리터가 내장 toString 메소드를 통해 obj 객체를 "[object Object]" 문자로 변환하기 때문입니다. Java가 모든 유형의 키를 허용할 수 있는 이유는 해당 Object가 HashCode 메소드를 구현하고 각 클래스가 Object의 HashCode를 상속하거나 대체하므로 모든 변수에 해시 값이 있기 때문입니다. JS로 시도해 볼 수도 있습니다.

앞서 언급한 toString 메소드는 모든 유형을 이와 유사한 문자로 변환하는 데 사용되며, 숫자로 변환하는 데 사용되는 또 다른 메소드인 valueOf가 있습니다. 숫자는 색인화하기 쉽기 때문에 먼저 valueOf를 시도해 보겠습니다.

코드 복사 코드는 다음과 같습니다.

객체 .prototype.valueOf = function()
{
alert("안녕~")
}

var map = []
var obj = { };
map[obj] = 1;

결과가 매우 실망스럽습니다. 대화 상자가 팝업되지 않아 JS 엔진이 obj 객체를 객체로 변환하려고 시도하지 않았음을 나타냅니다. 숫자. 이제 toString 메서드로 변경해 보세요.
코드 복사 코드는 다음과 같습니다.

Object.prototype.toString = function()
{
alert("안녕~")
}

var map = {}
var obj = {};
map[ obj] = 1;

대화상자가 나타납니다. 물론 우리는 데이터를 반환하지 않았습니다. 이 1은 map["undefine"]에 저장되었습니다. 그러나 값을 반환하고 각 변수에 대해 고유한 값을 보장할 수 있다면 원래 map[key] 메서드를 사용하여 모든 유형을 색인화할 수 있습니다. Object의 toString 메소드를 오버로드합니다:
코드 복사 코드는 다음과 같습니다:

var HASH_ID = 0 ;

Object.prototype.toString = function()
{
if(this._HASH == null)
this._HASH = HASH_ID
return "Obj :" this ._HASH;
};

테스트해 보겠습니다.
코드 복사 코드는 다음과 같습니다.

var HashMap = {};
var obj1 = {};
var obj2 = {}; obj1] = "Foo1 ";
HashMap[obj2] = "Foo2";
alert(HashMap[obj1] " & " HashMap[obj2])

HashMap[obj1] = "Bar1 ";
HashMap[obj2] = "Bar2";
alert(HashMap[obj1] " & " HashMap[obj2]);


각각 출력: Foo1 & Foo2 및 Bar1 & obj1과 obj2를 나타내는 Bar2는 항상 동일한 인덱스에 해당합니다.
물론 객체 자체가 toString 메서드를 재정의하는 경우 반드시 그런 것은 아닙니다. 매번 다른 값을 반환할 수 있습니다. 따라서 사용할 때는 실제 상황에 따라 적절하게 조정하십시오. (2011/3/12)
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.