【记录】有关parseInt的讨论
問題由來,某群的一個討論:
parseInt(1/0, 19) = 18;parseInt的用法:
parseInt(string [, radix])注意,第一個參數是String類型,當radix未指定的時候,那么默認基地是10。
轉換規則:
1、首先查看位置 0 處的字符,判斷它是否是個有效數字;如果不是,該方法將返回 NaN,不再繼續執行其他操作。
2、位置 0 處的字符有效,該方法將查看位置 1 處的字符,依次向后進行同樣的測試,直到發現非有效數字的字符或者到達字符串末尾為止,
3、返回轉換成功的數字
因此有比較熟悉的例子:
parseInt('F') => 'NaN' parseInt('F', 16) => 15下面將Infinity作為第一參數,結果就是下面這樣:
parseInt(Infinity) => 'NaN' parseInt(Infinity, 16) => 'NaN'先將Infinity轉換為String類型(Infinity.toString() => 'Infinity'),因為不論是十進制還是十六進制,第一個字符串都會失敗,所以直接返回'NaN'。
但是'I'在19 ~ 36進制情況下,是可以轉換為數字的,而且表示的數字就是18,所以:
由于
1/0 => Infinity;所以
parseInt(1/0, 19) => 18;由于基數radix的范圍介于2 ~ 36之間,所以0 ~ 9, a ~ z, A ~ Z在36進制下都可以轉換成功,轉換測試如下:
var arr = [], A_code = 65, Z_code = 65 + 25;for(var i = 0; i <= 9; ++i){arr.push(i);}for(var i = A_code; i <= Z_code; ++i){arr.push(String.fromCharCode(i));}//arr = [0, 1, 2, ... 9, 'A', 'B', ... 'Z']arr.forEach(function(item){// console.log(item, ':', parseInt(item, 36)); })//output : 0:0, 1:1, 2:2, ... Z:35;回到Infinity的例子:
第一個字符'I'在19 ~ 36基數的情況下都可以轉換成功
第二個字符'N'在36進制中表示為23, 所以'N'在24 ~ 36基數的情況下都可以轉換成功,
后面的字符類推
測試:
arr.push(r); if(s_index == Infinity.toString().length - 1){ret_output(arr);}})}catch(e){}}
結果:
19進制: 18 * 19**0 = 18
20進制: 18 * 20**0 = 18
21進制: 18 * 21**0 = 18
22進制: 18 * 22**0 = 18
23進制: 18 * 23**0 = 18
24進制: 18 * 24**5 + 23 * 24**4 + 15 * 24**3 + 18 * 24**2 + 23 * 24**1 + 18 * 24**0 = 151176378
25進制: 18 * 25**5 + 23 * 25**4 + 15 * 25**3 + 18 * 25**2 + 23 * 25**1 + 18 * 25**0 = 185011843
26進制: 18 * 26**5 + 23 * 26**4 + 15 * 26**3 + 18 * 26**2 + 23 * 26**1 + 18 * 26**0 = 224651640
27進制: 18 * 27**5 + 23 * 27**4 + 15 * 27**3 + 18 * 27**2 + 23 * 27**1 + 18 * 27**0 = 270812475
28進制: 18 * 28**5 + 23 * 28**4 + 15 * 28**3 + 18 * 28**2 + 23 * 28**1 + 18 * 28**0 = 324267766
29進制: 18 * 29**5 + 23 * 29**4 + 15 * 29**3 + 18 * 29**2 + 23 * 29**1 + 18 * 29**0 = 385849803
30進制: 18 * 30**6 + 23 * 30**5 + 15 * 30**4 + 18 * 30**3 + 23 * 30**2 + 18 * 30**1 + 29 * 30**0 = 13693557269
31進制: 18 * 31**6 + 23 * 31**5 + 15 * 31**4 + 18 * 31**3 + 23 * 31**2 + 18 * 31**1 + 29 * 31**0 = 16647948474
32進制: 18 * 32**6 + 23 * 32**5 + 15 * 32**4 + 18 * 32**3 + 23 * 32**2 + 18 * 32**1 + 29 * 32**0 = 20115447389
33進制: 18 * 33**6 + 23 * 33**5 + 15 * 33**4 + 18 * 33**3 + 23 * 33**2 + 18 * 33**1 + 29 * 33**0 = 24164998832
34進制: 18 * 34**6 + 23 * 34**5 + 15 * 34**4 + 18 * 34**3 + 23 * 34**2 + 18 * 34**1 + 29 * 34**0 = 28872273981
35進制: 18 * 35**7 + 23 * 35**6 + 15 * 35**5 + 18 * 35**4 + 23 * 35**3 + 18 * 35**2 + 29 * 35**1 + 34 * 35**0 = 1201203301724
36進制: 18 * 36**7 + 23 * 36**6 + 15 * 36**5 + 18 * 36**4 + 23 * 36**3 + 18 * 36**2 + 29 * 36**1 + 34 * 36**0 = 1461559270678
?
轉載請注明來自小西山子【http://www.cnblogs.com/xesam/】
本文地址:http://www.cnblogs.com/xesam/archive/2012/10/09/2716018.html
轉載于:https://www.cnblogs.com/xesam/archive/2012/10/09/2716018.html
總結
以上是生活随笔為你收集整理的【记录】有关parseInt的讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PowerDesigner建数据库模型增
- 下一篇: 分离