2012-06-22 3 views
26

그래서, if-else 문에서 논리 연산자를 사용하여 좀 더 복잡한 연산을 작성하려고합니다. 나는 내가 괄호를 쓸 수 있다는 것을 안다. 그리고 이것이 그것을하는 더 좋은 방법이라는 것을 안다. 그러나 나는 호기심을 갖고있다. 그래서 나는 물을 것이다. 내가 이런 식으로하면 :어떤 논리 연산자가 선행을 취하는가

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) { 
//Do something 
} else { 
//Do something else 
} 

괄호를 사용하지 않고 어떻게 조작 할 수 있습니까? PEMDAS와 비슷한 논리 연산자에 대한 연산 순서가 있다는 것을 알고 있습니다. 맞습니까?

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

또는 'OR'연산자 대신 우선적으로 적용하고 같이가는 끝나는 경우 어쩌면 :

(firstRun == true || selectedCategory != undefined) && selectedState != undefined 

전체 목록 것 그것은 이런 식으로 뭔가를 실행 할 수 있을지 궁금 해요 당신이 어딘가에서 그것을 찾을 수 있다면 좋을 것입니다. 이것을위한 작업 순서. 감사! 조건문에 대한 모든 사용 사례 기본적으로 99 %를 커버 엄지 손가락의

답변

44

내 규칙은 다음과 같습니다

  1. 그룹화 : ()
  2. 회원 접속 . or [...]
  3. 하지 : !
  4. 비교, 예 귀하의 예를 들어 너무 Javascript Operator Precedence

    :

    (firstRun == true || selectedCategory != undefined && selectedState != undefined) 
    

    동일 논리 < , >= , === , !=, ...
  5. &&
  6. 논리 OR ||

MDN 당신에게 철저한 분석을 제공합니다

위에서 언급 한 것보다 더 복잡한 것이 있으면 어쨌든 읽기 쉽도록 코드를 리팩터링합니다.

+0

정확하게 필요한 것; 덕분에 – JTApps

+0

'새'는 어떨까요? 멤버 액세스 및 함수 호출과 우선 순위가 같기 때문에 왼쪽에서 오른쪽으로 이동한다고 가정합니다. 'new Foo(). bar()'는'(new Foo()). bar()'와 동일합니까? 'new Foo() (3)'는'(new Foo()) (3)'와 동일합니까? – chharvey

1

: 대부분의 프로그래밍 언어에서 일반적으로

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

및 우선 순위가 더 높음

7

this chart for precedence을 참조하십시오.

코드를 읽는 다음 사람이 다음과 같이 생각하기 때문에 어떤 일이 발생하는지 설명하지 않을 것입니다. "WTF?"

그래서 더 나은 솔루션을 사용하면 우선 순위를 알고있는 경우에도 괄호 의 조건을 래핑하는 것입니다, 제대로 그것을 적용 코드가 작동

이 모든 것을하지 말아야 할 오래된 지혜를 다음과 당신이 그것을 할 수 있기 때문에 그냥. 항상 결과에 눈을 유지할 수 있습니다.

+0

+1 괄호 사용을 조언했다. – geekchic

+0

그래, 네가하는 말을 이해하고있어, 나에 대해 묻는 요지는 무엇보다 개인적인 지식에 더 가깝다. 감사합니다 – JTApps

1

를 논리 연산자의 우선 순위가 실제로 ECMAScript Specification에 정의되지 않은 반면, MDN 그것의 꽤 좋은 일을하고도 Logical Operators에 대한 별도의 페이지가 있습니다.

내 관심사 Logical Operator Precedence가 실제로 ECMAScript 사양에 정의되어 있지 않기 때문에 각각의 브라우저 공급 업체가 잠재적으로 다를 수 있습니다 (인터넷 익스플로러와 이야기하고 있습니다!) YMMV. 이벤트 사람에

여기이 다른 브라우저에서 테스트하고자하는 테스트 케이스 바이올린의 : 엄지 손가락의 꽤 좋은 규칙은 여기에있다 http://jsfiddle.net/HdzXq/

6

입니다. 수학 사람의 이러한 연산자를 생각 : (. 예를 들어 0 + 1 = 1 => TRUE)

  • AND은 곱셈이다. (예를 들어 0 * 1 = 0 => FALSE)
  • OR 당신이 기억하는 경우, 당신은 모두가 알고

을 추가 그 곱셈은 항상 이 오기 전에이 더해진다.

+1

이것은 실제로 결과 비트의 값뿐만 아니라 선결 조건의 측면에서, 정말 좋은 니모닉입니다! – Christoph

관련 문제