programing

객체와 해시의 차이점은 무엇입니까?

nasanasas 2020. 12. 30. 08:14
반응형

객체와 해시의 차이점은 무엇입니까?


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;

설명해야 할 다른 코드 예제가 있습니까?

여기서 핵심 질문 은 객체와 해시의 차이점무엇입니까?


아무것도 없습니다. 세 가지 모두 문자 그대로 동일합니다.


서로 바꿔서 사용할 수있는 다른 표기법입니다. 대괄호 구문을 사용하는 [ ]것이 더 매력적일 수있는 많은 상황 이 있습니다. 예는 변수로 객체를 참조 할 때입니다.

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

Java 및 C #과 같은 다른 언어에서는 해시 테이블 / 해시 맵의 키로 모든 객체 (단지 문자열 또는 숫자가 아님)를 사용할 수 있습니다. JavaScript에서는 그렇지 않습니다. 키는 단순히 문자열로 변환됩니다.

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

임의의 객체를 키로 사용하는 것이 유용 할 수 있으며,이 경우 jshashtable 과 같은 것을 사용할 수 있습니다 .

면책 조항 : jshashtable을 작성했습니다.


사실 JavaScript의 모든 개체는 해시입니다. 이것은 객체의 속성과 메서드의 해시입니다. 사실, 자바 스크립트의 모든 것은 해시 (즉 이름 / 값 쌍 목록)입니다.

객체의 메서드, 속성을 호출하거나 변수를 참조 할 때마다 내부 해시 조회를 수행합니다.


샘플에 차이가 없습니다. 모두 명명 된 속성을 가진 개체입니다. 이러한 속성을 생성 / 참조하는 다양한 방법을 방금 보았습니다.


그들은 동일합니다.

서로 바꿔서 사용할 수 있습니다.


모두 똑같다고 생각합니다. 세 번째 버전은 동적 속성 이름과 함께 사용할 수 있습니다. 첫 번째는 쓰기가 가장 짧습니다.


그들은 동일합니다. 마찬가지로 []new Array()동일합니다.

JavaScript의 핵심 유형에 대한 자세한 내용은 MDC Core JavaScript 1.5 참조를 참조하십시오 .

{}다음과 같은 증명을 원하는 경우 new Object():

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

!!! ACHTUNG AVERTISSEMENT 경고 !!! 절대로 프로덕션 코드 prototypeObject유형 속성에 할당하지 마십시오 . 전체 글로벌 네임 스페이스를 오염시킬 것입니다.


기술적으로는 동일합니다. 코드를 작성할 때 쉽게 할 수 있습니다 myobject['someproprty' + 'somethingElseConcatenated]. "점 표기법" myobject.someproperty을 사용할 때는 할 수없는 일입니다.

ECMAscript의 저자 중 한 명인 Douglas Crockford는 var a = new Object()제가 이해하지 못한 어떤 이유로 구문 을 사용하지 말 것을 제안 합니다. 어쨌든 관심이 있다면 그의 프레젠테이션을 볼 가치가 있습니다 (여러 부분으로 구성되어 있으며 첫 번째 부분은 http://video.yahoo.com/watch/111593/1710507 )


모든 엔진 (브라우저)은 다르게 구현하지만 크롬의 V8에 초점을 맞 춥니 다 (1 년 전에 대부분의 최신 브라우저에서 수행 한 성능 테스트를 기반으로 v8 지침을 따르면 유사한 성능 향상을 제공합니다).

기본적으로 발생하는 것은 다음과 같습니다.

  1. 즉석에서 속성을 추가하고 삭제할 수있는 동적 객체를 구현하려면 해시 테이블이 가장 간단한 솔루션이지만 자바 (랜덤 액세스 ...)의 일반 객체만큼 효율적이지 않습니다.
  2. What V8 does is trying to guess based on few strategies if your object is a regular object(has final set of properties set in specific order, etc...) or a hashtable. At first it assumes this is a simple object and each new property causes creation of a new structure of an object and copying of the old one on it plus the new property. If the object is categorize as "difficult" - it is moved to a hushtable.
  3. If v8 notices too many "mistakes" - it moves everything to hashtables - therefore you get poor performance (thats why you want to use constructors that init all of your members or structures inited in a json...)

Please see this links: 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-object-representation

Also a very good lecture: https://www.youtube.com/watch?v=UJPdhx5zTaw

Hope it helps...


Actually, there is nothing called 'hashtable' or 'hashmap' in JavaScript. The object in JavaScript behaves like a 'hash' [objects in JavaScript are simply key/value properties] and hence the confusion.

ReferenceURL : https://stackoverflow.com/questions/1143498/difference-between-an-object-and-a-hash

반응형