2014-12-20 3 views
5

bool의 비트 연산자가 JavaScript에서 bool을 반환하지 않는다는 것을 알게되었습니다. 나는 그것이 버그 일 것임에 틀림 없다고 생각했다. 그러나 나는 ECMAScript spec에서 그것을 조사했다. 그리고 확실히, 그것은 비트 연산자가 bool이 아니라 숫자를 반환한다고 말한다. 부울 값으로 사용할 때 발생하는 별난에 대한 말은하지 않습니다. 왜 그렇게 된거야? 나는이 기술을 다른 언어로 수년간 사용해 왔기 때문에 JavaScript에서 다른 점이 왜 그렇게 당황 스럽습니까? 어떤 아이디어? 아무도 이런 방식으로 비트 연산자를 사용하지 않았기 때문에 (아니면 나를 제외하고) 기술적 인 이유가 있습니까? 형식을 확인하고 부울을 반환하는 것이 어려울 것이라고 상상할 수 없습니다.JavaScript : 부울 값의 비트 OR이 부울 대신 숫자를 반환하는 이유는 무엇입니까?

참고로, 다음 코드

var found = false; 
console.log(found, typeof(found)); 

found |= true; 
console.log(found, typeof(found)); 

found = true; 
console.log(found, typeof(found)); 

다음 출력을 생성

false 'boolean' 
1 'number' 
true 'boolean' 

편집 :

요청에 의해, I는 C 이것을 사용한, C++, 나는 PHP에 대해 맹세하지는 않을 것이지만 꽤 확신합니다. 예, C/C++에 형식이 지정되어 있으므로 내부적으로 다를 수 있습니다. JavaScript가 왜 다르게 동작하는지 궁금 할뿐입니다. 요청에 의해

, 나는 일반적으로 사용하는 것이 방법의 예 | 그들을을 지정할 수의 비트 연산자는 (항상 숫자에 피연산자로 변환) 일관되게 행동 갖는 =

var foundLowest = false; 

for(var k = 0; k < someLength; ++k) { 
    foundLowest |= someFunctionThatReturnsTF(k); 
} 

if(foundLowest === true) { 
    /* do stuff */ 
} 
+1

당신은'의 실제 사용 사례의 일부 샘플을 추가 할 수 있습니까? –

+0

그 점에 관해서는 당신이 말하고있는 것은 어떤 언어입니까? 부울을 사용하여'| ='를 지원합니까? –

+0

나는 부울 값에 대해서조차 항상 숫자 값을 반환하는 비트 연산을한다고 상상할 수 있습니다. 후드 아래에서 고려하면 수치 자체와 동일시됩니다. boolean 반환 값을 기대하는 이유는 무엇입니까? –

답변

6

은 충분히 좋은 이유처럼 보인다 그들은 그렇습니다. 몇 년 전에는 ||=과 유사한 속기 연산자를 추가하는 것에 대한 es 토론 목록에 대한 이야기가있었습니다. 그러나 Eich   &   Co는 그와 같은 것들을 추가하는 것에 대해 매우 보수적이었고, "didn ' 통사론의 무게를 끌어 낸다. " :-) 자바 스크립트 부울에 값을 강요하는 행복하기 때문에, 당신이 행복하게 현재의 스타일을 사용할 수 있으며 truetrue에 강제 변환 1에 강제 변환하기 때문에, 그것은 여전히 ​​작동, 그리고 false 것을

참고 0에 강제 변환하는 false에 coerces. 부울 값에 대한`또는`&`| 예컨대 :

var a = false; 
 

 
a |= true; 
 
// Even though `a` is now `1`, it works just fine 
 
if (a) { 
 
    snippet.log(a + " => if branch"); // Does this one 
 
} else { 
 
    snippet.log(a + " => else branch"); 
 
} 
 

 
a &= false; 
 
// Even though `a` is now `0`, it works just fine 
 
if (a) { 
 
    snippet.log(a + " => if branch"); 
 
} else { 
 
    snippet.log(a + " => else branch"); // Does this one 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Hehe, 네, 저는 형식 강요에 대해 편집증에 지나지 않습니다. 타입 안전 형 평등/불평등 연산자를 사용하고, 잊었을 때 jshint를 사용합니다. C/C++에서 매달린 것 같아요.특히 생성자와 함축적으로 변환하는 수천 가지의 다른 방법을 사용하는 C++에서는 문제를 일으킬 수 있습니다. – GreatBigBore

+1

@GreatBigBore : 유형 강제 변환은 실제로 까다로울 수 있지만 사실/부적절한 부분 집합은 매우 간단합니다. 거짓 값은 '0', 'NaN', '' '', 'null', 'undefined'및 물론, 거짓; 그 밖의 모든 것은 사실입니다. –

관련 문제