5

나는 Closure Compiler가 며칠 전 첫눈에 단축 할 수있는 특정 코드를 단축하지 않는 이유에 대해 질문을했지만 그 이유는이 경우에는 적용 할 수 없다. 그리고 나는 왜 이것이 ' 여기에 단축.클로저 컴파일러 - ++> = 3이 ++ a> 3이 될 수 있습니까?

내가 가진 무엇 코드 :

var a = 0; 
function b() { 
    return a++ >= 3; 
} 

지금 사전 증가 및 사후 증분있다. a++ 반환 a다음 단위로 그것을, ++a 첫번째 증가 a다음 수익률이 - 차이점은 반환 값입니다. 이 내려 온다 무엇

내 코드 (공백 제거를 무시)로 단축 될 수 있다는 것입니다 :

var a = 0; 
function b() { 
    return ++a > 3; 
} 

그러나, 폐쇄 컴파일러이 변경 (또는 인식)하지 않는 것 같습니다.

질문 : 따라서 어떤 부작용이 일 때 a++ >= 대신 사용될 수 있습니까?

+0

왜 그렇게하고 싶습니까? 어떤 방식 으로든 성능을 향상시키는 방법을 알 수는 없습니다. –

+0

성능 때문이 아니라 코드 길이 때문입니다. Closure Compiler는 공백을 없앰으로써 코드를 단축하고,'a ++> = 3'을'++ a> 3'으로 단축 할 수 있습니다. 매우 흥미롭지는 않지만 나는 단지 궁금했다. – pimvdb

+3

당신은 2 가지 조건을 충족시켜야하고 이득은 거의 없으므로 시간을 낭비하지 않았거나 더 중요한 일에 집중할 수 없었을 것입니다. – fazo

답변

7

여기에서 이고이 구조체의 특정 가장자리 경우입니다 (그러나 3은 아닙니다).

JavaScript는 숫자를 IEEE-754 부동 소수점 64 비트 복식으로 저장하고 "유일한"은 2^53까지의 "정확한"정수 표현을 보장하기 때문에 발생합니다 (구현 방식에 따라서는 높은 범위, 나도 몰라).

이 파이어 폭스 4에 :

a = 2e53 
a++ >= 2e53 // true 

a = 2e53 
++a > 2e53 // false 

진짜 문제는 매우 특별한 변화가있을 것 이득을 실현 무엇 입니까? -0

해피 코딩.

+0

Firebug에서 Firefox 3.6'(Number.MAX_VALUE + 1) === Number.MAX_VALUE'이 'true'입니다. –

+0

그러나 Chrome에서도 'Number.MAX_VALUE + 1e308 === Infinity'입니다. 또한 Chrome은 'e + 308'까지 올라간 것으로 보입니다. – pimvdb

1

왜 모든 가장자리 조건을 직접 확인하지 않습니까?

function b(a) { 
    return a++ >= 3; 
} 

function b2(a) { 
    return ++a > 3; 
} 

console.log(b(2) === b2(2)) 
console.log(b(3) === b2(3)) 
console.log(b(4) === b2(4)) 

출력은 각각의 경우에 true이다.

+0

네, Closure Compiler가 그것을 무시하는 이유는 제 실제적인 질문이었습니다. – pimvdb

2

는 오른쪽 피연산자 (검색 예에서 3)의 범위 [-2 52 2 52]에서 일정한 정수 경우이 크기 최적화를 적용하는 것이 안전. 다른 경우 (예 : 오른쪽 피연산자가 소수 또는 매우 큰 경우)에는 안전하지 않습니다.

나는 때문에 폐쇄가이 최적화를 구현하지 않는 것을 상상 :

  • 가이 최적화가 안전하다는 것을 확인하려면 많이 필요,
  • 만 '아마 돈 매우 구체적인 상황에 적용 매우 자주 올 수 있으며,
  • 단 하나의 문자 만 저장하므로 걱정할 필요가 거의 없습니다.