JavaScript에서 &와 &&의 차이점은 무엇입니까?


82

JavaScript에서 &와 &&의 차이점은 무엇입니까?

예제 코드 :

var first  = 123;
var second = false;
var third  = 456;
var fourth = "abc";
var fifth  = true;
alert(first & second); // 0
alert(first & third);  // 72
alert(first & fourth); // 0
alert(first & fifth);  // 1

alert(first && second); // false
alert(first && third);  // 456
alert(first && fourth); // abc
alert(first && fifth);  // true

&&는 논리적 인 "and"인 것 같습니다. 둘 다 참이면 항상 두 번째 값을줍니다.

그러나 &는 무엇입니까?

(그런데, &&는 파이썬에서 "and"인 것 같고, &는 파이썬에서 & 인 것 같습니다.)


논리 연산자 대신 비트 연산을 사용하지 않는 이유가 궁금하다면 4 & 1 = 0을 고려하십시오. 길이가 4와 1 인 두 배열 사용; 비트 : fruits.length & veggies.length === 0및 부울 : fruits.length && veggies.length === true.
Tom Anderson

답변:


149

& 비트 AND

이 연산자는 두 개의 숫자를 예상하고 숫자 를 반환합니다 . 숫자가 아닌 경우 숫자로 캐스트됩니다.

어떻게 작동합니까? Wikipedia에 답변이 있습니다 : https://en.wikipedia.org/wiki/Bitwise_operation#AND

참고 : Javascript에서는이 연산자를 사용 하지 않는 것이 좋습니다. 정수 데이터 유형이없고 부동 소수점 만 있기 않는 . 따라서 부동 소수점은 모든 작업 전에 정수로 변환되어 속도가 느려집니다. 또한 일반적인 웹 응용 프로그램에서는 실제로 사용되지 않으며 읽을 수없는 코드를 생성합니다.

일반 규칙 : 피하십시오. 그것을 사용하지 마십시오. 유지 관리 및 읽기가 가능한 JS 코드에는 거의 없습니다.

&& 논리적 AND

두 개의 인수를 예상하고 다음을 반환합니다.

  • 거짓으로 평가되는 첫 번째 용어
  • 그렇지 않으면 마지막 용어 (모두 true-y 인 경우)

여기 예시들이 있습니다 :

0 && false          0 (both are false-y, but 0 is the first)
true && false       false (second one is false-y)
true && true        true (both are true-y)
true && 20          20 (both are true-y)

Boolean에서만 사용한다면 이것은 정확히 수학적 논리의 AND 연산자입니다.

&& 연산자 연결

이 연산자가 위와 같이 정의 된 이유는 연산자 체인입니다. 이 연산자를 연결하고 위의 규칙을 유지할 수 있습니다.

true && 20 && 0 && 100          0 (it is the first false-y)
10 && 20 && true && 100         100 (last one, since all are true-y)

&& 단락

정의에서 알 수 있듯이 한 용어가 거짓임을 알게 되 자마자 다음 용어에 대해 신경 쓸 필요가 없습니다. Javascript는 심지어 이것을 한 단계 더 발전 시켰으며 용어는 평가되지도 않습니다. 이를 단락이라고합니다.

true && false && alert("I am quiet!")

이 문은 아무것도 경고하지 않고 false반환됩니다. 따라서 &&연산자를 if 문에 대한 더 짧은 대체물로 사용할 수 있습니다 . 다음은 동일합니다.

if (user.isLoggedIn()) alert("Hello!")
user.isLoggedIn() && alert("Hello!")

거의 모든 JS 압축기는이 트릭을 사용하여 2 바이트를 절약합니다.


5
&&는 JavaScript에서 부울을 반환하지 않습니다.
이상현

1
AFAIK &&는 false-y이면 첫 번째 값을 반환하고 그렇지 않으면 두 번째 값을 반환합니다.
duri

1
완전히 수정 된 답변입니다.
Rok Kralj 2014

첫 번째 값을 반환하면 어떻게 실행할 수 있는지 이해할 수 없습니다. if ($ ( '# form1'). parsley (). validate () == true && $ ( '# form2'). parsley () .validate () == true) {// 두 형식이 모두 유효하면 무언가를 수행합니다} 첫 번째 함수가 false이면 종료되고 두 번째 형식의 유효성을 검사하지 않으므로 IF 문을 실행하는 방법은 무엇입니까?
user991

1
@ user777 두 번째 형식의 유효성을 검사 할 때만 작업을 수행해야하는 경우 두 번째 형식의 유효성을 검사하는지 여부는 무관하지 않습니까? 첫 번째 양식이 실패하면 전체 작업이 유효하지 않습니다. 그러나이 스레드는 모두 if 문을 사용하지 않고 반환 에 관한 것이기 때문에 이것은 완전히 별개의 질문 입니다.
Ryan Williams

24

&비트 "and"입니다. 즉, 이진수로 변환 된 두 개의 숫자가있는 경우 결과는 1두 숫자가있는 위치에 숫자가있는 숫자가 1됩니다.

  100011  //35
& 111001  //57
---------
  100001  //35 & 57 == 33

-3

두 개의 부울 값을 합친 것이 참인지 거짓인지 확인하려면 둘 다 확인하려면 (웹 페이지의 유효성 검사와 같이) &연산자를 사용할 수 있습니다 . &비트 AND입니다.

&&연산자를 사용하여 첫 번째 값이 거짓임을 확인하면 두 번째 값을 확인하지 않고 평가를 종료합니다.


1
&부울 값으로 작업 할 때는 비트 AND ( )를 사용하지 않습니다 . 이 연산자의 적절한 사용에 대한 다른 답변을 참조하십시오.
FtDRbwLXw6

@drrcknlsn, 다른 답변을 읽었지만 여기에 설명이 잘 작동합니다. 귀하의 주장에 대한 자세한 정보를 제공 할 수 있습니까 ??
azerafati 2014-06-22

1
@Bludream :이 답변의 설명이 잘못되었습니다. 논리 (부울) 비교에는 비트 연산자를 사용하지 않습니다. 논리 (부울) 연산자를 사용합니다. 그들은 다른 (비슷하지만) 일을하고, 다른 입력을 기대하고, 다른 출력을 생성하고, 다른 연산자 우선 순위를 갖습니다.
FtDRbwLXw6

1
나는 그것이 나쁜 관행이라는 데 동의하지만 &를 부울 값과 함께 사용하면 작동합니다. false는 0으로 평가되고 true는 1로 평가됩니다. &를 사용할 수 있기 때문에이 답변에 기술적으로 잘못된 것은 없습니다.
dyoung 2010 년

-3

전체적으로 높고 상세한 통찰력으로 그들은 싱글 & 만 작동하는 조건부 평가가 있다는 사실을 대부분 놓쳤습니다. MULTIPLE chained && each! ==의 IF 문 문자열을 조건으로 치는 내 머리를 해결 한 실용적인 평신도의 대답은 FAILURE를 유발하고 합법적으로 &를 사용해야했습니다. 나는 하나 이상의 &&가있는 곳에서! == 이미 평가를 중단했고 첫 번째 평가가 발견 된 후에는 더 이상 진행되지 않는다는 점을 감안할 때 정답을 얻었던 부당하게 반대표를 던진 Jake Wayne (및 Russ)에게 감사합니다 == !. &&를 사용하면 첫 번째 평가에서! == [예 : 그릇된]. 내 실패 코드는

IF ((sessionStorage.myLable !== "LableStringA") && (sessionStorage.myLable !== "LableStringB") && (sessionStorage.myLableZ !== "LableStringA") && (sessionStorage.myLableZ !== "LableStringB")) { ...)

여기에서 && 대신 단일 &를 적절하게 대체하고 사용하는 것은 실제로 현실 세계에서 그리고 기술적으로 정답입니다. 코드에 대한 통찰력과 이해에 대해 Jake Wayne (및 Russ)에게 다시 한 번 감사드립니다.


1
나는 당신이 그것을 이해하지 못한다면 '작동하기 때문에'무언가를 사용하지 않는 것이 좋습니다. 나중에 작동하지 않고 디버깅 할 수 없을 때 문제가 발생할 수 있습니다. 또는 더 나쁜 것은 면접에서 그것을 사용하려고 시도하고 그들은 당신을 ಠ_ಠ처럼 봅니다. 조건이 예상대로 평가되지 않으면 논리 오류가있는 것입니다. 첫 번째 조건이 false를 반환하는 경우 4 개의 조건을 모두 평가할 이유가 없습니다. 결합 된 조건
Brandon

감사합니다 Brandon. 나는 당신의 전반적인 우려에 의문을 제기하지 않습니다. 나는 항상 === 컨벤션을 연기하고 도입합니다. 그러나 여기에서 네 가지 평가는 모두 마지막으로 의미있는 의견과 달리 필요했습니다. 네 가지 평가는 모두! ==이어야하며 괄호 안에 해당 형식으로 사용되었습니다. 높은 논리가 예상 한대로 수행되지 않는 연결 &&였습니다. 단일 & 사용은 내가 테스트 한 모든 주요 OS의 컴파일러에서 올바르게 읽었습니다.
GladHeart

왜 그것이 우아하게 작동하는지에 대한 후속 조치로서 Russ & Jake의 거짓 비난 된 대답의 명확성에있을 것입니다. 네 가지 평가를 모두 평가해야합니다. &&를 사용하면 첫 번째 평가가 거짓 일 때 중지 / 중단됩니다. 단일 &를 사용하면 나머지 세 가지 조건을 반드시 계속 평가할 수 있습니다. Russ & Jake는 ""&& "연산자를 사용하여 첫 번째 값이 거짓임을 확인하면 평가를 종료하고 두 번째 값을 확인하지 않습니다."라고 말했습니다. 반면에 "모든 항목을 확인하려면 (웹 페이지의 유효성 검사와 같이)"& "연산자를 사용할 수 있습니다."& "는 비트 AND입니다."
GladHeart

1
모든 항목을 확인해야하는 경우 if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}의도 한 내용이 더 명확 해 보이도록 논리를 구성 할 수도 있습니다 (myLable 값이 두 값 중 하나인지 확인하거나 유효성 검사에 실패한다고 가정합니다). . 귀하의 상태에 부작용이없는 한 모두 평가할 필요가 없습니다. 운전자가 의도 한대로 작동하고, 그러나 당신의 논리는 이성을 상실했다
브랜든

후속 브랜든을 위해 Ty. 측면에서 볼 때 ===를 찾는 것이 네 가지 유효성 검사 각각에서 수십 가지 가능성 중 하나가 될 수있는 내 경우 조건의 필요성을 여전히 놓친다. 간단히 말해, 네 개 중 어느 것도 특정 페이지 마커 값을 포함하지 않는 경우 스크립트를 실행하여 그 부족을 보완합니다. 네 가지 모두 ==!로 표시되어야합니다. "myLable의 값이 두 값 중 하나인지 확인하려는 경우"가 아니라 실제로 myLable이 가능성의 더미에서 많은 것 중 하나입니다. 따라서 비 동등성은 4x가 필요한 단일 질문입니다.
GladHeart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.