Ben mağazalar bir değişken var false
ya true
, ama gerek 0
yoksa 1
bunun yerine, sırasıyla. Bunu nasıl yapabilirim?
bool === true ? 1 : 0
V8'in en hızlısı olduğu için kullanmak isteyeceklerdir .
bool ? 1 : 0;
Ben mağazalar bir değişken var false
ya true
, ama gerek 0
yoksa 1
bunun yerine, sırasıyla. Bunu nasıl yapabilirim?
bool === true ? 1 : 0
V8'in en hızlısı olduğu için kullanmak isteyeceklerdir .
bool ? 1 : 0;
Yanıtlar:
Javascript'te kullanabileceğiniz üçlü bir operatör vardır:
var i = result ? 1 : 0;
NaN
. Eğer L33T istiyorsanız ve girişi garanti ederseniz, çirkin olun, aksi takdirde üçlü + doğruluk testi en iyisidir.
İşleneni+
sayıya dönüştüren tekli işleci kullanın .
+ true; // 1
+ false; // 0
Tabii ki, yine de sunucu tarafındaki verileri dezenfekte etmeniz gerektiğini unutmayın, çünkü bir kullanıcı istemci tarafındaki kod ne olursa olsun sunucunuza herhangi bir veri gönderebilir.
Number()
daha yavaştır.
bool === true ? 1 : 0
en hızlı, yakın bir saniye ile bool | 0
.
En iyi çözüm:
fooBar | 0
Bu, asm.js'de tamsayı türünü zorlamak için kullanılır.
1
Eğer fooBar değilse bu bir tamsayı döndürmez ?
Sayı işlevini kullanmayı tercih ederim . Bir nesneyi alır ve bir sayıya dönüştürür.
Misal:
var myFalseBool = false;
var myTrueBool = true;
var myFalseInt = Number(myFalseBool);
console.log(myFalseInt === 0);
var myTrueInt = Number(myTrueBool);
console.log(myTrueInt === 1);
Bir jsFiddle'da test edebilirsiniz .
Önerilen tüm cevapların bir JSperf karşılaştırmasını oluşturdum .
TL; DR - mevcut tüm tarayıcılar için en iyi seçenek:
val | 0;
.
Güncelleme:
Görünüşe göre bu günlerin hepsi oldukça özdeş, tek fark Number()
fonksiyonun en yavaş olması ve en iyi varlık olması val === true ? 1 : 0;
.
Bunu yapmanın tipik yolu:
Number(true) // 1
Number(false) // 0
Bu kısayola bugün geldim.
~~ (doğru)
~~ (yanlış)
Açıklayabildiğimden çok daha akıllı insanlar:
JavaScript bir sayı değeri beklerken, bunun yerine bir boole alırsa, bu boole değerini bir sayıya dönüştürür: true ve false sırasıyla 1 ve 0'a dönüştürür. Böylece bundan faydalanabilirsiniz;
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
Daha fazla okuma Tür Dönüşümleri Javascript için Kesin Kılavuz Bölüm 3.8.
Tekli +
operatör bununla ilgilenir:
var test = true;
// +test === 1
test = false;
// +test === 0
Doğal olarak bunu saklamadan önce sunucuda akıl sağlığı kontrol etmek isteyeceksiniz, bu yüzden yine de bunu yapmak için daha mantıklı bir yer olabilir.
===
, çünkü true == 1
doğru olsa bile "açık dönüşüm :-) true === 1
yerine yanlış.
Yazdığım bazı kodlarda sadece bu konuyla uğraşıyordum. Benim çözümüm bitsel ve kullanmaktı.
var j = bool & 1;
Sürekli bir sorunla başa çıkmanın daha hızlı bir yolu bir işlev oluşturmak olacaktır. Diğer insanlar tarafından daha okunabilir, bakım aşamasında anlamak için daha iyi ve yanlış bir şey yazma potansiyelinden kurtulur.
function toInt( val ) {
return val & 1;
}
var j = toInt(bool);
Düzenle - 10 Eylül 2014
Chrome'da operatörle aynı üçlü bir operatör kullanarak dönüşüm yapılmaması, bazı nedenlerden dolayı Chrome'da daha hızlı değildir. Neden daha hızlı olduğu konusunda hiçbir anlam ifade etmiyor, ancak sanırım yol boyunca bir yerde mantıklı olan bir çeşit düşük seviye optimizasyon.
var j = boolValue === true ? 1 : 0;
Kendiniz test edin: http://jsperf.com/boolean-int-conversion/2
FireFox ve Internet Explorer'da, gönderdiğim sürümü kullanmak genellikle daha hızlıdır.
Düzenle - 14 Temmuz 2017
Tamam, size hangisini kullanmanız gerektiğini söylemeyeceğim. Her korkutucu tarayıcı, her yöntemle işlemi ne kadar hızlı yapabildiklerinde yukarı ve aşağı gidiyor. Bir noktada Chrome aslında bitwise ve sürümün diğerlerinden daha iyi performans gösterdi, ancak sonra aniden çok daha kötüydü. Ne yaptıklarını bilmiyorum, bu yüzden onu kimin umurunda bırakacağım. Böyle bir işlemin ne kadar hızlı yapıldığını önemsemek için nadiren herhangi bir neden vardır. Mobil cihazlarda bile bu hiçbir şey işlemez.
Ayrıca, üzerine yazılamayacak bir 'toInt' prototipi eklemek için daha yeni bir yöntem var.
Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
return this & 1;
}});
Bağlamımda, en kolay yol olan boole'den opaklık değeri elde ettiğim React Native: Tekli + işleci kullanın.
+ true; // 1
+ false; // 0
Bu, boole sayısını sayıya dönüştürür;
style={ opacity: +!isFirstStep() }
Bunu sadece boole prototipini genişleterek yapabilirsiniz
Boolean.prototype.intval = function(){return ~~this}
Orada neler olduğunu anlamak çok kolay değil, bu yüzden alternatif bir sürüm
Boolean.prototype.intval = function(){return (this == true)?1:0}
sizin gibi şeyler yapabileceğiniz
document.write(true.intval());
Koşulları saklamak için booleans kullandığımda genellikle bit alanlarına dönüştürürüm, bu durumda prototip işlevinin genişletilmiş bir sürümünü kullanırım
Boolean.prototype.intval = function(places)
{
places = ('undefined' == typeof(places))?0:places;
return (~~this) << places
}
hangi ile yapabilirsin
document.write(true.intval(2))
çıktı olarak 4 üretir.
Tüm bu örnekleri test ettim, bir kıyaslama yaptım ve son olarak daha kısa olanı seçmenizi öneririm, bu performansı etkilemez.
Ubuntu sunucusunda çalıştırıldı 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")
Sonuç
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
1'den 0'a tamsayı x değeri değiştirmek istiyorsanız ve 0'dan 1'e kadar (x + 1)% 2 kullanabilirsiniz