상세 컨텐츠

본문 제목

[JavaScript] 자바스크립트에서 enum문법 정의 관련

WEB/JavaScript

by AlrepondTech 2017. 11. 23. 17:47

본문

반응형
728x170

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

 

 

출처: http://code.i-harness.com/ko/q/4649f

 

 

자바 스크립트에서 enum을 정의하기위한 기본 구문은 무엇입니까? 같은 것 :

my.namespace.ColorEnum = {     RED : 0,     GREEN : 1,     BLUE : 2 }  // later on  if(currentColor == my.namespace.ColorEnum.RED) {    // whatever }

아니면 더 바람직한 관용어가 있습니까?

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

업데이트 : 모든 upvotes 모두 주셔서 감사하지만, 아래의 내 대답은 더 이상 자바 스크립트에서 열거 형을 작성하는 가장 좋은 방법이라고 생각하지 않습니다. 자세한 내용은 내 블로그 게시물을 참조하십시오 : Javascript의 Enums .

이름을 알려주는 것은 이미 가능합니다.

if (currentColor == my.namespace.ColorEnum.RED) {    // alert name of currentColor (RED: 0)    var col = my.namespace.ColorEnum;    for (var name in col) {      if (col[name] == col.RED)        alert(name);    } }

또는 값 객체를 만들 수 있으므로 케이크를 가지고 먹을 수도 있습니다.

var SIZE = {   SMALL : {value: 0, name: "Small", code: "S"},    MEDIUM: {value: 1, name: "Medium", code: "M"},    LARGE : {value: 2, name: "Large", code: "L"} };  var currentSize = SIZE.MEDIUM; if (currentSize == SIZE.MEDIUM) {   // this alerts: "1: Medium"   alert(currentSize.value + ": " + currentSize.name); }

Javascript에서는 역동적 인 언어이므로 열거 형 값을 나중에 설정에 추가 할 수도 있습니다.

// Add EXTRALARGE size SIZE.EXTRALARGE = {value: 3, name: "Extra Large", code: "XL"};

열거 형 필드 (이 예제에서 값, 이름 및 코드)는 신원 확인에 필요하지 않으며 편리함을 위해서만 존재한다는 점을 기억하십시오. 또한 size 속성의 이름 자체는 하드 코드 될 필요가 없지만 동적으로 설정할 수도 있습니다. 따라서 새로운 enum 값의 이름 만 알면 문제없이 추가 할 수 있습니다.

// Add 'Extra Large' size, only knowing it's name var name = "Extra Large"; SIZE[name] = {value: -1, name: name, code: "?"};

물론 이는 일부 가정을 더 이상 만들 수 없다는 것을 의미합니다 (이 값은 예를 들어 크기의 올바른 순서를 나타냅니다).

Javascript에서는 객체가지도 또는 해시 테이블과 같음을 기억하십시오. 이름 - 값 쌍 집합입니다. 루프를 반복하거나 미리 조작하지 않고 조작 할 수 있습니다.

예 :

 

for (var sz in SIZE) {   // sz will be the names of the objects in SIZE, so   // 'SMALL', 'MEDIUM', 'LARGE', 'EXTRALARGE'   var size = SIZE[sz]; // Get the object mapped to the name in sz   for (var prop in size) {     // Get all the properties of the size object, iterates over     // 'value', 'name' and 'code'. You can inspect everything this way.           } } 

그리고 네가 네임 스페이스에 관심이 있다면 간단하지만 강력한 네임 스페이스와 자바 스크립트에 대한 의존성 관리를 위해 내 솔루션을 살펴보고 싶을 것이다. Packages JS

728x90

 

 

반응형

답변에 댓글을 게시 할 수 없으므로 Google에 높은 점수를 표시했기 때문에 스레드를 부딪쳤을 것입니다.

1.8.5부터 물체를 봉인하고 고정 할 수 있으므로 위의 내용을 다음과 같이 정의하십시오.

var DaysEnum = Object.freeze({"monday":1, "tuesday":2, "wednesday":3, ...})

또는

var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...} Object.freeze(DaysEnum)

and voila! JS enums;

출처 : https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze

IMHO 따옴표는 필요하지 않지만 일관성을 유지했습니다.

결론 : 당신은 할 수 없습니다.

가짜로 만들 수는 있지만 유형 안전을 얻지는 못합니다. 일반적으로 정수 값에 매핑 된 문자열 값의 간단한 사전을 만들어이 작업을 수행합니다. 예 :

var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}  Document.Write("Enumerant: " + DaysEnum.tuesday);

이 접근 방식의 문제점은 무엇입니까? 실수로 열거자를 다시 정의하거나 실수로 중복 열거 형 값을 가질 수 있습니다. 예 :

DaysEnum.monday = 4; // whoops, monday is now thursday, too

편집하다

Artur Czajka의 Object.freeze는 어떻습니까? 월요일부터 목요일에 집을 지키는 것을 막을 수 있니? - 튀김 쿼드

물론, Object.freeze 는 내가 불평 한 문제를 완전히 해결할 것입니다. 나는 위의 글을 쓸 때 Object.freeze 가 실제로 존재하지 않는다는 것을 모두에게 상기시키고 싶습니다.

자 .... 이제는 아주 흥미로운 가능성을 열어줍니다.

편집 2 
열거 형을 생성하는 데 매우 유용한 라이브러리가 있습니다.

http://www.2ality.com/2011/10/enums.html

그것이 열거 형의 모든 유효한 사용에 아마도 맞지는 않지만, 아주 먼 길을 간다.

 

 

 

=================================

=================================

=================================

 

 

 

반응형
그리드형


관련글 더보기

댓글 영역