나는 저장하는 변수가 false
나 true
있지만, 내가 필요 0
하거나 1
대신, 각각. 어떻게해야합니까?
bool === true ? 1 : 0
V8에서 가장 빠른 을 사용하려고합니다 .
bool ? 1 : 0;
나는 저장하는 변수가 false
나 true
있지만, 내가 필요 0
하거나 1
대신, 각각. 어떻게해야합니까?
bool === true ? 1 : 0
V8에서 가장 빠른 을 사용하려고합니다 .
bool ? 1 : 0;
답변:
단항 +
연산자를 사용하면 피연산자가 숫자로 변환됩니다.
+ true; // 1
+ false; // 0
물론 클라이언트 측 코드의 내용에 관계없이 사용자가 서버로 데이터를 보낼 수 있기 때문에 서버 측의 데이터를 계속 삭제해야합니다.
Number()
더 느립니다.
bool === true ? 1 : 0
에서 가장 가까운 초로 나타납니다 bool | 0
.
최고의 솔루션은 다음과 같습니다.
fooBar | 0
정수형을 강제하기 위해 asm.js에서 사용됩니다.
1
fooBar가 아닌 경우 정수를 반환 하지 않습니까?
숫자 기능을 선호 합니다 . 객체를 가져와 숫자로 변환합니다.
예:
var myFalseBool = false;
var myTrueBool = true;
var myFalseInt = Number(myFalseBool);
console.log(myFalseInt === 0);
var myTrueInt = Number(myTrueBool);
console.log(myTrueInt === 1);
jsFiddle 에서 테스트 할 수 있습니다 .
내가 만든 JSperf의 모든 제안 답변의 비교.
TL; DR-현재 모든 브라우저에 가장 적합한 옵션은 다음과 같습니다.
val | 0;
.
최신 정보:
요즘에는 Number()
기능이 가장 느리지 만 가장 좋은 기능을 제외하고는 모두 거의 동일합니다 val === true ? 1 : 0;
.
나는 오늘이 지름길을 만났다.
~~ (참)
~~ (거짓)
내가 설명 할 수있는 것보다 훨씬 똑똑한 사람들 :
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을 더 읽으십시오.
단항 +
연산자는 다음을 처리합니다.
var test = true;
// +test === 1
test = false;
// +test === 0
서버에 저장하기 전에 자연스럽게 상태를 확인하고 싶기 때문에 어쨌든이 작업을 수행하는 것이 더 합리적입니다.
===
true == 1
true === 1
방금 작성한 일부 코드 에서이 문제를 다루고있었습니다. 내 솔루션은 비트 단위로 사용하는 것이 었습니다.
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;
}});
부울 프로토 타입을 간단히 확장하여이를 수행 할 수 있습니다.
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를 생성합니다.
이 예제를 모두 테스트했으며 벤치 마크를 수행했으며 마지막으로 더 짧은 것을 선택하는 것이 좋습니다. 성능에 영향을 미치지 않습니다.
우분투 서버 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
정수 x 값을 1에서 0으로 변경하고 0에서 1로 변경하려면 (x + 1) % 2