Okuduğum bu ama yazıldığı tam anlamadım radix argümanı ile parseInt bölüm
Neden bu parseInt(8, 3)
→ NaN
ve parseInt(16, 3)
→ 1
?
AFAIK 8 ve 16 böylece, taban-3 sayı değildir parseInt(16, 3)
dönmelidir NaN
çok
Okuduğum bu ama yazıldığı tam anlamadım radix argümanı ile parseInt bölüm
Neden bu parseInt(8, 3)
→ NaN
ve parseInt(16, 3)
→ 1
?
AFAIK 8 ve 16 böylece, taban-3 sayı değildir parseInt(16, 3)
dönmelidir NaN
çok
Yanıtlar:
Bu, insanların bildiklerinde bile her zaman yolculuk ettikleri bir şeydir. :-) Bunu aynı nedenden dolayı görüyorsunuz, parseInt("1abc")
1: parseInt
ilk geçersiz karakterde durur ve o noktada sahip olduğu her şeyi döndürür. Ayrıştırılacak geçerli karakter yoksa, geri döner NaN
.
parseInt(8, 3)
" "8"
baz 3'te ayrıştırma" anlamına gelir (sayıyı 8
bir dizeye dönüştürdüğünü unutmayın ; teknik özellikteki ayrıntılar ). Ama baz 3'te, tek haneli sayılar sadece vardır 0
, 1
ve 2
. "9"
Sekizli ayrıştırmasını istemek gibi . Orada beri hiçbir geçerli karakterler, elinde NaN
.
parseInt(16, 3)
"16"
3'te ayrıştırmasını istiyor. Ayrıştırılabildiğinden , ayrılıyor ve ayrıştırılamadığı için 1
duruyor 6
. Böylece geri döner 1
.
Bu soru çok dikkat çektiğinden ve arama sonuçlarında üst sıralarda yer alabileceğinden, çeşitli ifadeleri ve uygulamaları (burada SO'nun başka bir cevabından kaldırılmış) ile dizeleri JavaScript'teki sayılara dönüştürmek için seçeneklerin bir özeti:
parseInt(str[, radix])
- Dizenin başlangıcını olabildiğince büyük bir sayıya (tamsayı) dönüştürerek sonunda fazladan karakterleri yok sayar. Yani parseInt("10x")
bir 10
; x
göz ardı edilir. İsteğe bağlı bir radix (sayı tabanı) bağımsız değişkenini destekler parseInt("15", 16)
, 21
( 15
hex olarak). Herhangi bir yarıçap yoksa, dize 0x
(veya 0X
) ile başlamadığı sürece ondalık olduğunu varsayar ; bu durumda bunları atlar ve hex değerini alır. (Bazı tarayıcılar 0
, sekizli ile başlayan dizeleri işlemek için kullanılır ; bu davranış hiçbir zaman belirtilmez ve ES5 belirtiminde özellikle izin verilmez .)NaN
Ayrıştırılabilir basamak bulunamazsa döndürür .
parseFloat(str)
- Gibi parseInt
, ama kayan nokta sayıları yapar ve sadece ondalık destekler. Yine ipte ilave karakterler öylesine göz ardı edilir parseFloat("10.5x")
ise 10.5
( x
göz ardı edilir). Yalnızca ondalık desteklendiği parseFloat("0x15")
için 0
(çünkü ayrıştırma işlemi sona erer x
). NaN
Ayrıştırılabilir rakamlar bulunmazsa döndürür .
Tekli +
, örn. +str
- (Örn. Örtük dönüşüm) Kayan nokta ve JavaScript'in standart sayı gösterimini kullanarak tüm dizeyi bir sayıya dönüştürür (sadece rakamlar ve ondalık nokta = ondalık; 0x
önek = hex; 0o
önek = sekizli [ES2015 +]; bazı uygulamalar bunu genişletir bir 0
lidere sekizlik gibi davranmak , ancak katı modda değil). +"10x"
olduğu NaN
, çünkü x
edilir değil görmezden geldi. +"10"
olduğu 10
, +"10.5"
olduğu 10.5
, +"0x15"
olduğu 21
, +"0o10"
bir 8
[ES2015 +]. Bir gotcha Has: +""
ise 0
, değil NaN
Tahmin edebileceğiniz gibi.
Number(str)
- Tam olarak örtük dönüşüm gibi (örn. +
Yukarıdaki tekli gibi), ancak bazı uygulamalarda daha yavaş. (Önemli olması muhtemel değil.)
parseInt
ilk toString
argümandaki ilk kullanımlar ? Bu mantıklı olurdu.
parseInt
algoritmanın ilk adımı : ecma-international.org/ecma-262/7.0/…
123e-2
verir ve sonra ondalık noktada durur? 1
1.23
NumberFormatException
her seferinde bir tane verecektir .
parseInt
(dizeye ilk argüman coercing) mantıklı. Amacı parseInt
Is olan ayrıştırmak bir tam sayıya bir dize. Bu nedenle, dize olmayan bir şey verirseniz, dize ile temsilini başlatmak mantıklıdır. Bundan sonra ne yapar bir bütün 'nother hikaye'
Aynı nedenden ötürü
>> parseInt('1foobar',3)
<- 1
In doc , parseInt
bir dize alır. Ve
Eğer dize bir dize değil, o zaman bir dizeye dönüştürülür
Yani 16
,, 8
veya '1foobar'
önce dizeye dönüştürülür.
Sonra
Eğer
parseInt
karşılaşmalarda belirtilen tabanda bir sayı olmayan bir karakter, onu ve tüm başarılı karakterleri yok sayar
Yani olabildiğince dönüştürür. 6
, 8
Ve foobar
göz ardı edilir ve sadece daha önce ne dönüştürülür edilmektedir. Hiçbir şey yoksa NaN
iade edilir.
/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]
parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]
parseInt(2, 3); // 2 - yes we can !
parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]
parseInt(16, 3); // 1
//'16' => '1' (6 ignored because it not in [0,1,2])
/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/
parseInt('FOX9', 16); // 15
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]
Bazı örnekler:
parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]
parseInt('1011', 2); // 11 (decimal NOT binary)
parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]
parseInt(786,8); // 7
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])
parseInt(76,8); // 62
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10