2013-09-26 2 views
-1

JavaScript로 어지러운 동안 배열 요소를 undefined와 비교하는 것이 매우 흥미 롭다는 것을 알았습니다. 고려 :javascript undefined와의 비교 비용

L = [1,2,3]; 
if (L[1] == undefined) 
    console.log('no element for key 1'); 
else 
    console.log('Value for key 1'+L[1]); 

내가 대신 시퀀스 또는 다른 컨테이너 반복으로, 자바 스크립트에서 시퀀스의 값을 확인 할 수있는 멋진 방법 먹으 렴 생각하지만, 내 질문은 : 그 오류가 효율적 경향이 아닌지? 그러한 비교 비용은 얼마입니까?

+0

_ "시퀀스 나 다른 컨테이너를 반복하지 않고 [...]"_ - 좀 더 자세히 설명 할 수 있습니까? 어쩌면 차이를보기 위해 그 사례에 대한 코드 예를 게시 할 수 있습니다. – elclanrs

+1

'=='대신'==='를 사용하면 오류가 발생하여 성능이 약 10 배 ~ 12 배 증가합니다. – Brian

+0

글쎄, 그게 해로운 비교인지 궁금 해서요 아니면 정말 목록에서 실행 속도를 잃지 않고 요소를 찾는 쉬운 방법으로 그렇게 할 수 있습니다. 그 의견에 감사드립니다. \ o –

답변

0

특정 값가있는 경우 코드는 테스트하지 않습니다; [배열] 인덱스가 이고 할당되지 않은 값이 인 경우 테스트합니다. (또한 잘못 때문에 ==를 사용하는 null 같은 일부 위양성 값을 감지하지만 또 다른 질문에 대한이야 ..)

이를 고려

a의 값이 무엇
L = ["hello","world","bye"] 
a = L["bye"] 
b = L[1] 

하고 무엇을하지 "안녕"에 대해 뭐라고 했니? b의 값은 무엇이며 1은 L의 요소로 존재할 수도 있고 없을 수도있는 값과 어떤 관련이 있습니까?

즉, 반복 배열 - 알 수없는 인덱스 값을 찾으려면? 여러 값에 대한 연산을 수행할까요? - 및 은 인덱스가 인 요소에 액세스하는 경우 두 가지가 있으며 개로 서로 바뀔 수 없습니다.

M = {hello: 1, world: 1, bye: 1} 
c = M["hello"] 

지금 c의 값이 무엇인가

플립 측면

, 오브젝트 속성이 유사한 (하지만 유용한) 효과를 달성하기 위해 이용 될 수 있는가? 키로 사용 된 값은 데이터와 어떤 관련이 있습니까? (A 조회 키으로 사용)을 속성 이름 데이터 관련이 경우

는 확인 되 고에 대한 유용한 무언가를 말할 수있다 - 예,는 "안녕하세요"가 입니다! 반복 (또는 편리한 방법을 사용하여, 작은 순서, 또는 드문 작업에 물론 ..의 (이 hasOwnProperty를 사용하지 않고 일부 가양를 감지 할 수 있지만, 또 다른 질문에 대한이야 ..)


을 그리고 Array.indexOf 또는 Array.some과 같은) 값의 존재를 확인하는 것은 "정당한"것이며 "성능 영향"을 초래하지 않습니다.

0

undefined을 유도하기 위해 범위를 벗어나는 배열에 액세스하는 경우 예를 들어 최적화 된 코드에서 수행 된 경우 최적화 된 코드가 버려지고 최적화되지 않기 때문에 느리게 말할 수 있습니다. 다른 언어에서는 예외가 발생하여 매우 느리거나 관리되지 않는 언어에서 프로그램에 정의되지 않은 동작이 발생하고 운이 좋으면 충돌이 발생합니다.

그래서 항상 경계가 액세스에서하지 않도록하기 위해 컬렉션의 .length을 확인합니다.

또한 성능 측면에서 void 0보다 undefined을 더 선호합니다. 이는 런타임 변수 조회가 아니라 컴파일 시간 상수이기 때문입니다.