그러나 주의 깊게 비교해 보면 그 차이가 여전히 매우 크다는 것을 알 수 있습니다. 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)