2017-12-21 15 views
0

나는 어떤 필드를 사용해야 하는지를 알기 위해 객체와 투영을 사용하는 함수를 코딩하고 있습니다.o [str] vs (o => o.str)

const o = { 
    a: 'Hello There'  
}; 


function foo(o, str) { 
    const a = o[str]; 
    /* ... */  
} 

foo(o, 'a'); 

아니면 기능 :

function bar(o, proj) { 
    const a = proj(o); 
    /* ... */ 
} 

bar(o, o => o.a); 

내가 V8 내 자바 스크립트 객체와 클래스를 만드는 생각 나는이 같은 문자열을 사용하는 경우는

궁금하네요. 동적으로 필드에 액세스하기 위해 문자열을 사용하는 경우 해시 테이블이나 다른 객체가 아닌 클래스를 만들 수 있습니까?

답변

2

여기에 V8 개발자가 있습니다. "어떤 패턴을 사용해야합니까?" 아마 "의존한다". 나는 하나 또는 다른 시나리오가 앱의 동작에 따라 더 빨라질 수도 있다고 생각할 수 있습니다. 그래서 저는 여러분이 (실제 코드에서 마이크로 벤치 마크가 아닌) 양쪽 모두를 시도하거나 자신을 측정하거나, 더 큰 맥락에서 더 선호하거나 선호하는 것을 선택하고 프로파일 링이 이것을 보여줄 때까지 걱정하지 말 것을 제안합니다. 시간을 할 가치가있는 실제적인 병목 현상입니다.

function baz(o, str, a) { 
    /* ... */ 
} 

baz(o, "a", o.a); 

나는 일이 실제로이 간단한 있다면, 당신은 아마 같으면 실현 '

속성은 실제로 호출 사이트에서 알려진 경우, 다음 가장 빠른 옵션을 호출하기 전에 속성을로드하는 아마 이 질문을하는 것이 아닙니다. 그 가정이 사실이라면 마이크로 벤치 마크의 단순화가 옳은 대답을 쉽게 바꿀 수있는 훌륭한 사례입니다.


클래스의 질문에 대한 답변은이 결정이 V8은 후드 아래 개체를 나타내는 방법에 아무런 영향을주지 않는다는 것이다 - 대부분은 없습니다 당신이 그들을 읽기 방법에 당신이 당신의 개체를 수정하는 방법에 따라 달라집니다. 또한, 레코드 : 모든 객체가 "숨겨진 클래스"가

  • ; 해시 테이블 표현을 사용하든 사용하지 않든간에
  • 해시 테이블 모드 또는 모양 추적 모드가 주어진 객체에 대해 더 나은지 여부는 유스 케이스에 의존하는 것 중 하나인데, 정확하게 두 모드가 모두 존재합니다. 나는 당신이 (프로파일 링에서) 그것이 당신의 경우에 문제가된다는 것을 알지 못한다면 (V8의 발견 적 방법이 올바른 것으로 받아들이는 경우가 많으며, 수동 개입은 거의 필요하지 않다) 너무 걱정하지 않을 것이다.
+0

투영법이 루프 내부에있어 호출 사이트에서 속성 액세스를 수행하는 명백한 해결 방법이 더 이상 적용되지 않는다고 가정 해 보겠습니다 .-) – Bergi

+0

사실, 제 경우에는 필드를 알 수 없습니다. 함수를 호출하기 전에 사용됩니다. 잘 이해하면 숨겨진 클래스가 항상 만들어집니다. 그러나 V8은 myobject [variableStr]로 무엇을 할 것인가? – Greg

+0

속성 검색을 수행합니다. 물론 캐시 가능한로드만큼 빠르지는 않습니다. 그러나 대안이 큰 세트의 함수 중 하나를 호출하는 것이라면 매우 빠릅니다. 어느 것이 더 빠를 것인지 또는 그 차이가 중요한지 예측하기는 어렵습니다. (물론, 내가 쓴 것처럼, 나는 현실에서 질문의 단순한 발췌 문장보다 더 복잡 할 것이라고 기대한다.) – jmrk