2016-10-14 1 views
5

JavaScript map에는 두 가지 방법이 있습니다. gethas. 메소드 get은 요소가 존재하지 않으면 을 반환하고 정의되지 않은 값이에 추가 된 경우 undefined를 반환합니다.JavaScript 맵에서 Double Seevs Unsigned : TryGet wanted

그래서 기존 메서드를 반환하거나 새로운 메서드를 추가하고 존재하지 않는 경우 반환하는 내 메서드 GetAlways or such을 구현하면 런타임 성능을 희생하여 이중 매핑을 찾거나 API 순도를 희생하지 않고 정의되지 않은 것으로 정의됩니다. 지도에 정의되지 않은 값을 안전하게 추가 할 수 없게합니다.

TryGet from C#과 비슷한 세 번째로 효율적이고 순수한 선택이 있습니까? 불순한 선택을위한

코드 : 느린 선택을위한

Map.prototype.GetAlways = function(name){ 
    let child = this.get(name); 
    if (child === undefined){ // equating undefined value to non-existence 
     child = {}; 
     this.set(name, child); 
    } 
    return child; 
} 

코드 :

Map.prototype.GetAlways = function(name){ 
    if(this.has(name)) // first map seek 
     return this.get(name); // second map seek 
    let child = {}; 
    this.set(name, child); 
    return child; 
} 
+1

arrow 연산자는 "this"키워드를 함수 외부의 의미로 바인딩합니다. 메서드에 함수 표기법을 사용하려고합니다. –

답변

2

undefined는 매개 변수의 부족을 표현하기위한 것입니다. 인수를 사용하는 것이 정당한 유일한 경우는 인수가 누락되었거나 함수가 아무것도 반환하지 않았는지 확인하는 것입니다. 누군가가 당신의지도에 정의되지 않은 것을 통과한다면, 그것은 당신의 문제가 아닙니다.

귀찮다면, C++ 사고 방식으로 JS를 만들어보십시오. 설명서에 예상 한 것과 보장하는 것을 명시 적으로 작성하십시오. 그런 다음 잘못된 매개 변수에 대한 테스트 (및 코드 성능)를 낭비 할 필요가 없습니다. 그것이 우리가 우려의 분리라고 부르는 것입니다.

... 내 대답은 맵에 정의되지 않은 저장을 허용하지 않으려 고 코드에서이를 방지하기 위해 아무 것도하지 않는 것입니다. 가장자리 사건을 무시하고 사람들이 그렇게 할 수 없다고 말하십시오.

+1

나는 동의하지 않는다. 정의되지 않은 값을 존재하지 않는 것으로 간주하는 것은 JavaScript에 대해 관용적이므로 불투명하지는 않다. 함수 인수가 목록에 없으면 또한 정의되지 않았으며 undefined를 인수로 전달할 가능성도 섞여 있습니다. 객체 속성의 동작은 다음과 같습니다. var t = {}; t.x = undefined; console.assert ('x'in t); – alpav