부울 결과를 숫자 / 정수로 변환


276

나는 저장하는 변수가 falsetrue있지만, 내가 필요 0하거나 1대신, 각각. 어떻게해야합니까?


8
제공된 기술 중 일부에 대한 성능 비교는 다음과 같습니다. jsperf.com/conversion-from-boolean-to-number .
Sam

4
Node.JS 사용자는 bool === true ? 1 : 0V8에서 가장 빠른 을 사용하려고합니다 .
Qix-MONICA가 MISTREATED했습니다.

3
또는bool ? 1 : 0;
Atrahasis

답변:


343

자바 스크립트에는 다음과 같은 삼항 연산자가 있습니다.

var i = result ? 1 : 0;

7
가장 좋은 답변입니다. 왜? 이것은 더 일반적인 진실성에 대해 작동하며 모든 유형 (문자열, 숫자 등)을 허용합니다. 단항 답변은 실제로 영리하지만 문자열을 전달하면 문자열이 반환 NaN됩니다. 따라서 L33T를 원하고 입력을 보장하려면 소변을 보지 않으면 3 차 + 진실 테스트가 가장 좋습니다.
gdibble

465

단항 +연산자를 사용하면 피연산자가 숫자로 변환됩니다.

+ true; // 1
+ false; // 0

물론 클라이언트 측 코드의 내용에 관계없이 사용자가 서버로 데이터를 보낼 수 있기 때문에 서버 측의 데이터를 계속 삭제해야합니다.


50
시원하지만 (나는 이것을 전혀 생각하지 못했지만) 엄청나게 느리다 (크롬에서는 97 % 느리다). 조심하세요!
Qix-MONICA가 MISTREATED했습니다.

5
이 개정판을 확인하십시오 . Number()더 느립니다.
Qix-MONICA가 MISTREATED했습니다.

23
bool === true ? 1 : 0에서 가장 가까운 초로 나타납니다 bool | 0.
Qix-MONICA가 MISTREATED했습니다.

1
곱하기 (예 : 3 * false)는 너무 잘못 느끼지만 작동합니다. :) 감사!
mattsoave

1
@DerkJanSpeelman Typescript에서 무언가가 허용되지 않는다고해서 Javascript에서는 그렇게하지 않아야한다는 의미는 아닙니다. 서로 다른 언어이지만 서로 관련이 있습니다.
lonesomeday

119

최고의 솔루션은 다음과 같습니다.

fooBar | 0

정수형을 강제하기 위해 asm.js에서 사용됩니다.


가장 빠른 것 중 하나; +1.
Qix-MONICA가 MISTREATED했습니다.

3
좋은데 또한 "Boolean ^ 0"을 사용할 수 있습니다. OR 또는 XOR이 작동합니다.
F8ER

1fooBar가 아닌 경우 정수를 반환 하지 않습니까?
ESR

58

숫자 기능을 선호 합니다 . 객체를 가져와 숫자로 변환합니다.

예:

var myFalseBool = false;
var myTrueBool = true;

var myFalseInt = Number(myFalseBool);
console.log(myFalseInt === 0);

var myTrueInt = Number(myTrueBool);
console.log(myTrueInt === 1);

jsFiddle 에서 테스트 할 수 있습니다 .


3
이것이 가장 좋은 답변입니다. 물론 바닥에. "대상을 취하는 것"만이 옳지 않습니다.
Rudie

2
mdn에 대한 링크는 w3schools (eeek!)보다 훨씬 낫습니다 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Olivvv

나는 이것이 읽기 쉽고 의도를 밝히기 때문에 이것이 최선의 방법이라고 생각합니다.
Sam

3
그것은 또한 느린.
Qix-MONICA가 MISTREATED했습니다.

45

내가 만든 JSperf의 모든 제안 답변의 비교.

TL; DR-현재 모든 브라우저에 가장 적합한 옵션은 다음과 같습니다.

val | 0;

.

최신 정보:

요즘에는 Number()기능이 가장 느리지 만 가장 좋은 기능을 제외하고는 모두 거의 동일합니다 val === true ? 1 : 0;.


2
흥미롭게도, 삼항은 이제 macOS 10.13.3의 Chrome 64.0.3282에서 가장 빠릅니다.
2540625

당시에는 가장 빠른 옵션이었습니다. 그것이 최선의 선택이라는 점과 다릅니다.
mikemaccana

41

입력하는 방법은 다음과 같습니다.

Number(true) // 1
Number(false) // 0

2
마지막으로 괜찮은 대답. 감사.
Erik Campobadal

30

나는 오늘이 지름길을 만났다.

~~ (참)

~~ (거짓)

내가 설명 할 수있는 것보다 훨씬 똑똑한 사람들 :

http://james.padolsey.com/javascript/double-bitwise-not/


2
흥미 롭군 나는 오늘 새로운 것을 배웠다. 그러나 미래의 나 또는 팀원들을 혼동시킬 가능성이 있기 때문에 어떤 프로젝트에서도이 기법을 사용하지 않을 것입니다.
nicholaides

1
해키 js는 나의 마음에 드는 것입니다. 진심으로 +1
Todd

16

JavaScript가 숫자 값을 기대하지만 부울을 수신하면 대신 해당 부울을 숫자로 변환합니다. true와 false는 각각 1과 0으로 변환됩니다. 따라서 이것을 활용할 수 있습니다.

var t = true;
var f = false;

console.log(t*1); // t*1 === 1
console.log(f*1); // f*1 === 0 

console.log(+t); // 0+t === 1 or shortened to +t === 1
console.log(+f); //0+f === 0 or shortened to +f === 0

Javascript에 대한 최종 안내서의 유형 변환 장 3.8을 더 읽으십시오.


13

단항 +연산자는 다음을 처리합니다.

var test = true;
// +test === 1
test = false;
// +test === 0

서버에 저장하기 전에 자연스럽게 상태를 확인하고 싶기 때문에 어쨌든이 작업을 수행하는 것이 더 합리적입니다.


"명시 적 변환 :-) ===true == 1true === 1
없이도

13

방금 작성한 일부 코드 에서이 문제를 다루고있었습니다. 내 솔루션은 비트 단위로 사용하는 것이 었습니다.

var j = bool & 1;

지속적인 문제를 해결하는 더 빠른 방법은 함수를 만드는 것입니다. 다른 사람들이 더 읽기 쉽고, 유지 보수 단계에서 이해하기 쉽고, 잘못된 것을 쓸 가능성을 제거합니다.

function toInt( val ) {
    return val & 1;
}

var j = toInt(bool);

편집-2014 년 9 월 10 일

Chrome에서 연산자와 동일한 삼항 연산자를 사용한 변환이 어떤 이유로 든 빠릅니다. 왜 더 빠른지 이해가되지 않지만 어딘가에 의미가있는 일종의 저수준 최적화라고 생각합니다.

var j = boolValue === true ? 1 : 0;

스스로 테스트하십시오 : http://jsperf.com/boolean-int-conversion/2

FireFox 및 Internet Explorer에서 게시 한 버전을 사용하는 것이 일반적으로 더 빠릅니다.

편집-2017 년 7 월 14 일

좋아, 사용하지 말아야 할 것을 말하지 않겠다. 모든 괴물 브라우저는 각 방법으로 작업을 얼마나 빨리 수행 할 수 있는지에 따라 오르 내 렸습니다. 한 시점에서 Chrome은 실제로 비트 단위 및 버전이 다른 비트 단위보다 우수하지만 갑자기 훨씬 나빴습니다. 나는 그들이 무엇을하고 있는지 모른다. 그래서 나는 단지 누가 신경 쓰는지 맡기겠다. 이와 같은 작업이 얼마나 빠른지 신경 쓸 이유가 거의 없습니다. 모바일에서도 아무것도 작동하지 않습니다.

또한 덮어 쓸 수없는 'toInt'프로토 타입을 추가하는 새로운 방법이 있습니다.

Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
    return this & 1;
}});

이 게시물에 대한 두 개의 공감대가 있습니다. 왜 당신이 그것을 하향 조정했는지 설명하지 않습니까? 그렇지 않으면 정당화되지 않은 공감 일뿐입니다.
니콜라스 R. 그랜트

1
jsperf의 결과는 99 배나 빠르기 때문에 조기 최적화 경로로 이어져 추악한 SQL 문에 집중해야 할 때 루프에서 나노초를 최적화합니다. 이에 접근하는 몇 가지 방법을 제공해 주셔서 감사합니다
RozzA

어떤 SQL 문? 여기에 하나의 쿼리가 없습니다. JSPerf를 언급하고 있다면 다른 사람의 테스트에서 연결했습니다. 내 것이 아닙니다. 나는 아무것도 작동하지 않기 때문에 솔직히 이것의 성능 측면에 관심이 없습니다. JS와 거의 동일한 기능을 가진 자체 언어를 만들었으며 int로 캐스팅하는 것은 어리석게 빠른 작업이었습니다. 프로토 타입 체인 등반은 그렇지 않았습니다. 그렇기 때문에 컴파일러에서 인라인 할 수있는 간단한 함수를 사용하여 내가 한 첫 번째 방법을 여전히 추천하는 이유입니다.
니콜라스 R. 그랜트

SQL은 '일반화되었습니다. 통찰력에 감사드립니다
RozzA

9

시프트 연산자 또는 xor를 사용하여 0을 추가 할 수도 있습니다.

val + 0;
val ^ 0;
val >> 0;
val >>> 0;
val << 0;

이것들은 다른 사람들의 대답과 비슷한 속도를 가지고 있습니다.


6

내 맥락에서 부울에서 불투명도 값을 얻는 React Native 가장 쉬운 방법은 단항 + 연산자를 사용하는 것입니다.

+ true; // 1
+ false; // 0

부울을 숫자로 변환합니다.

style={ opacity: +!isFirstStep() }

4

부울 프로토 타입을 간단히 확장하여이를 수행 할 수 있습니다.

Boolean.prototype.intval = function(){return ~~this}

무슨 일이 일어나고 있는지 이해하기가 쉽지 않으므로 대체 버전이 될 것입니다.

Boolean.prototype.intval = function(){return (this == true)?1:0}

당신이 할 수있는 일을 마치고

document.write(true.intval());

부울을 사용하여 조건을 저장하면 종종 비트 필드로 변환됩니다.이 경우 확장 버전의 프로토 타입 함수를 사용하게됩니다

Boolean.prototype.intval = function(places)
{
 places = ('undefined' == typeof(places))?0:places; 
 return (~~this) << places
}

당신이 할 수있는

document.write(true.intval(2))

출력으로 4를 생성합니다.




1

이 예제를 모두 테스트했으며 벤치 마크를 수행했으며 마지막으로 더 짧은 것을 선택하는 것이 좋습니다. 성능에 영향을 미치지 않습니다.

우분투 서버 14.04에서 실행, nodejs v8.12.0-26/10/18

    let i = 0;
console.time("TRUE test1")
    i=0;
    for(;i<100000000;i=i+1){
        true ? 1 : 0;
    }
console.timeEnd("TRUE test1")


console.time("FALSE test2")
    i=0;
    for(;i<100000000;i=i+1){
        false ? 1 : 0;
    }
console.timeEnd("FALSE test2")

console.log("----------------------------")

console.time("TRUE test1.1")
    i=0;
    for(;i<100000000;i=i+1){
        true === true ? 1 : 0;
    }
console.timeEnd("TRUE test1.1")


console.time("FALSE test2.1")
    i=0;
    for(;i<100000000;i=i+1){
        false === true ? 1 : 0;
    }
console.timeEnd("FALSE test2.1")

console.log("----------------------------")

console.time("TRUE test3")
    i=0;
    for(;i<100000000;i=i+1){
        true | 0;
    }
console.timeEnd("TRUE test3")

console.time("FALSE test4")
    i=0;
    for(;i<100000000;i=i+1){
        false | 0;
    }
console.timeEnd("FALSE test4")

console.log("----------------------------")

console.time("TRUE test5")
    i=0;
    for(;i<100000000;i=i+1){
        true * 1;
    }
console.timeEnd("TRUE test5")

console.time("FALSE test6")
    i=0;
    for(;i<100000000;i=i+1){
        false * 1;
    }
console.timeEnd("FALSE test6")

console.log("----------------------------")

console.time("TRUE test7")
    i=0;
    for(;i<100000000;i=i+1){
        true & 1;
    }
console.timeEnd("TRUE test7")

console.time("FALSE test8")
    i=0;
    for(;i<100000000;i=i+1){
        false & 1;
    }
console.timeEnd("FALSE test8")

console.log("----------------------------")

console.time("TRUE test9")
    i=0;
    for(;i<100000000;i=i+1){
        +true;
    }
console.timeEnd("TRUE test9")

console.time("FALSE test10")
    i=0;
    for(;i<100000000;i=i+1){
        +false;
    }
console.timeEnd("FALSE test10")

console.log("----------------------------")

console.time("TRUE test9.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+true;
    }
console.timeEnd("TRUE test9.1")

console.time("FALSE test10.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+false;
    }
console.timeEnd("FALSE test10.1")

console.log("----------------------------")

console.time("TRUE test9.2")
    i=0;
    for(;i<100000000;i=i+1){
        -true*-1;
    }
console.timeEnd("TRUE test9.2")

console.time("FALSE test10.2")
    i=0;
    for(;i<100000000;i=i+1){
        -false*-1;
    }
console.timeEnd("FALSE test10.2")

console.log("----------------------------")

console.time("TRUE test9.3")
    i=0;
    for(;i<100000000;i=i+1){
        true-0;
    }
console.timeEnd("TRUE test9.3")

console.time("FALSE test10.3")
    i=0;
    for(;i<100000000;i=i+1){
        false-0;
    }
console.timeEnd("FALSE test10.3")

console.log("----------------------------")

console.time("TRUE test11")
    i=0;
    for(;i<100000000;i=i+1){
        Number(true);
    }
console.timeEnd("TRUE test11")

console.time("FALSE test12")
    i=0;
    for(;i<100000000;i=i+1){
        Number(false);
    }
console.timeEnd("FALSE test12")

console.log("----------------------------")

console.time("TRUE test13")
    i=0;
    for(;i<100000000;i=i+1){
        true + 0;
    }
console.timeEnd("TRUE test13")

console.time("FALSE test14")
    i=0;
    for(;i<100000000;i=i+1){
        false + 0;
    }
console.timeEnd("FALSE test14")

console.log("----------------------------")

console.time("TRUE test15")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test15")

console.time("FALSE test16")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test16")

console.log("----------------------------")

console.time("TRUE test17")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test17")

console.time("FALSE test18")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test18")

console.log("----------------------------")

console.time("TRUE test19")
    i=0;
    for(;i<100000000;i=i+1){
        true >> 0;
    }
console.timeEnd("TRUE test19")

console.time("FALSE test20")
    i=0;
    for(;i<100000000;i=i+1){
        false >> 0;
    }
console.timeEnd("FALSE test20")

console.log("----------------------------")

console.time("TRUE test21")
    i=0;
    for(;i<100000000;i=i+1){
        true >>> 0;
    }
console.timeEnd("TRUE test21")

console.time("FALSE test22")
    i=0;
    for(;i<100000000;i=i+1){
        false >>> 0;
    }
console.timeEnd("FALSE test22")

console.log("----------------------------")

console.time("TRUE test23")
    i=0;
    for(;i<100000000;i=i+1){
        true << 0;
    }
console.timeEnd("TRUE test23")

console.time("FALSE test24")
    i=0;
    for(;i<100000000;i=i+1){
        false << 0;
    }
console.timeEnd("FALSE test24")

console.log("----------------------------")

console.time("TRUE test25")
    i=0;
    for(;i<100000000;i=i+1){
        ~~true;
    }
console.timeEnd("TRUE test25")

console.time("FALSE test26")
    i=0;
    for(;i<100000000;i=i+1){
        ~~false;
    }
console.timeEnd("FALSE test26")

console.log("----------------------------")

console.time("TRUE test25.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~true*-1-1;
    }
console.timeEnd("TRUE test25.1")

console.time("FALSE test26.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~false*-1-1;
    }
console.timeEnd("FALSE test26.1")

console.log("----------------------------")

console.time("TRUE test27")
    i=0;
    for(;i<100000000;i=i+1){
        true/1;
    }
console.timeEnd("TRUE test27")

console.time("FALSE test28")
    i=0;
    for(;i<100000000;i=i+1){
        false/1;
    }
console.timeEnd("FALSE test28")

결과

TRUE test1: 93.301ms
FALSE test2: 102.854ms
----------------------------
TRUE test1.1: 118.979ms
FALSE test2.1: 119.061ms
----------------------------
TRUE test3: 97.265ms
FALSE test4: 108.389ms
----------------------------
TRUE test5: 85.854ms
FALSE test6: 87.449ms
----------------------------
TRUE test7: 83.126ms
FALSE test8: 84.992ms
----------------------------
TRUE test9: 99.683ms
FALSE test10: 87.080ms
----------------------------
TRUE test9.1: 85.587ms
FALSE test10.1: 86.050ms
----------------------------
TRUE test9.2: 85.883ms
FALSE test10.2: 89.066ms
----------------------------
TRUE test9.3: 86.722ms
FALSE test10.3: 85.187ms
----------------------------
TRUE test11: 86.245ms
FALSE test12: 85.808ms
----------------------------
TRUE test13: 84.192ms
FALSE test14: 84.173ms
----------------------------
TRUE test15: 81.575ms
FALSE test16: 81.699ms
----------------------------
TRUE test17: 81.979ms
FALSE test18: 81.599ms
----------------------------
TRUE test19: 81.578ms
FALSE test20: 81.452ms
----------------------------
TRUE test21: 115.886ms
FALSE test22: 88.935ms
----------------------------
TRUE test23: 82.077ms
FALSE test24: 81.822ms
----------------------------
TRUE test25: 81.904ms
FALSE test26: 82.371ms
----------------------------
TRUE test25.1: 82.319ms
FALSE test26.1: 96.648ms
----------------------------
TRUE test27: 89.943ms
FALSE test28: 83.646ms

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.