JavaScript'te can sıkıcı bir sorunum var .
> parseInt(1 / 0, 19)
> 18
parseIntİşlev neden geri dönüyor 18?
JavaScript'te can sıkıcı bir sorunum var .
> parseInt(1 / 0, 19)
> 18
parseIntİşlev neden geri dönüyor 18?
Yanıtlar:
Sonucu 1/0DİR Infinity.
parseIntilk argümanını bir dize olarak ele alır, bu da her şeyden Infinity.toString()önce dize üretilerek çağrılır "Infinity". Yani, "Infinity"19 tabanındaki ondalık sayıya dönüştürmesini istediğiniz gibi çalışır .
İşte taban 19'daki ondalık değerlerle birlikte rakamlar:
Base 19 Base 10 (decimal)
---------------------------
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
a 10
b 11
c 12
d 13
e 14
f 15
g 16
h 17
i 18
Daha sonra ne olacağı parseInt, girdinin taranması için "Infinity"hangi kısmın ayrıştırılabileceğini bulmak ve ilkini kabul ettikten sonra durmasıdır I(çünkü n19 numaralı tabandaki geçerli bir rakam değildir).
Bu nedenle parseInt("I", 19), yukarıdaki tablo ile ondalık 18'e dönüştürülen aradığınız gibi davranır .
parseInt('Infini',24).
nde geçerli bir basamak var, bu yüzden aslında bitiyor parseInt("Infini", 24).
Olayların sırası şöyledir:
1/0 için değerlendirir InfinityparseInttemel 19'da 18 Infinityolduğunu okur ve mutlulukla not ederIparseInt dönüştürülemediğinden dizenin kalanını yoksayar.Herhangi bir baz için bir sonuç alacağınızı >= 19, ancak bunun altındaki bazlar için elde edemeyeceğinizi unutmayın. Bazlar için >= 24, no noktada geçerli bir basamak haline geldikçe daha büyük bir sonuç elde edersiniz .
parseIntİngiliz alfabesinde 26 harf olduğu için kabul edilecek en büyük taban 36'dır ve kural verilen tabanda geçerli rakamlar kümesi olarak rakamları ve ardından harfleri kullanmaktır.
Infinityiçin "Infinity"...
Yukarıdaki cevaplara eklemek için:
parseInt dizeleri sayılara ayrıştırmayı amaçlamaktadır (ipucu adındadır). Durumunuzda, 1/0 zaten bir sayı olduğu için hiç ayrıştırma yapmak istemezsiniz , bu yüzden garip bir işlev seçimi. Bir numaranız varsa (bunu yaparsınız) ve bunu belirli bir tabana dönüştürmek istiyorsanız, bunun yerine bir radix ile toString kullanmalısınız.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Yukarıdaki cevaplara eklemek için
parseInt(1/0,19) eşittir parseInt("Infinity",19)
Temel sayı 19 içinde 0-9ve A-I (or a-i)geçerli bir sayıdır. Yani, "Sonsuzluk" dan onu alır Itabanın 19 ve Sonra 18 olur 10 tabanına dönüştürür sonraki karakteri yani almaya çalışır nsayıya dize dönüştürme javascript davranışları gereğince (19 öylesine silip mevcut sonraki karakterler baz bulunmaz )
Yani, parseInt("Infinity",19)VEYA parseInt("I",19)VEYA yazarsanız parseInt("i",19), sonuç aynı olacaktır 18.
Yazdığınız Şimdi, eğer parseInt("I0",19)sonuç olacak 342
şekilde I X 19 (the base)^1 + 0 X 19^0 = 18 X 19^1 + 0 X 19^0= 18 X 19 + 0 X 1 =342
Benzer şekilde, parseInt("I11",19)sonuçlanacaktır6518
yani
18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 361 + 1 X 19 + 1 X 1
= 6498 + 19 + 1
= 6518
ifyardımcı olabilir.