今天在匆忙的寫代碼過程中,測試突然跑過來跟我說,有一個小的bug,但是不能完全的復現,但確實存在。需要我們這邊參與查找。首先來說一下我們這個的業務邏輯,其實非常的簡單,就是一個開房間的后台,里面有一項是設置這個房間的消耗金幣數。這個消耗是存在“最低消費”這個概念的。根據這個房間的不同配置,最低消費是不同的。房主可以自行更改這個消耗數,但是不能低於最低消耗。
業務很簡單,所以我們也很簡單的完成了,就是把最后提交的時候,我們驗證一下他這個輸入的金幣數大於最低消耗的金幣數就可以了。因為每次房間配置的不同,我們使用ajax獲取房間的最低消耗金幣數。然后驗證,結果有的時候就提示填寫的數值小於了最低消耗數。WTF,怎么可能呢。而且這個不是穩定的復現的,有的時候行,有的時候不行。最后在我們的積極測試下,能復現這個bug了,就是房間的最低消耗是200金幣,房主填寫的是1200金幣,這個時候提示小於最低了。也就是判斷中200>1200 ???
這個時候我突然想到了什么,就是大小比較的時候,數據類型是不是出錯了?肯定是,結果找到后台,發現是他們更改了數據的類型,原來的時候是number的數據類型,這次改成string類型了,而且我們寫的input輸入框,這里獲取到的數據類型是不是number?所以就有了一下的測試。先看代碼:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title></title>
6 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
7 <style type="text/css">
8 input{
9 width: 400px;
10 }
11 </style>
12 </head>
13 <body>
14 <h1>為了測試數據類中的數據轉換</h1>
15 <h4>填寫一個數值和1200比較</h4>
16 <input type="text" name="" id="" value="" placeholder="如果填的數字小1200,提示true,否則提示false"/>
17 <button>比較</button>
18 </body>
19 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
20 <script type="text/javascript">
21 var num1 = "1200"; 22 $("button").on("click",function(){ 23 var input_val = $("input").val(); 24 console.log($.type(input_val)); 25 console.log($.type($("input").val())); 26 if(num1>input_val){ 27 alert(num1+">"+input_val); 28 }else{ 29 alert(num1+"<"+input_val); 30
31 } 32 }) 33 </script>
34 </html>
這里基本上就是在重現我們的bug,當你填入200的時候,出現了200>1200的奇觀。准確的說應該是"200">"1200"。這個問題我是知道的,因為js中存在數據的隱性轉換,如果你用一個字符串跟一個數字比較的話,字符串會被轉換成數字類型,但是因為后台數據格式變了,所以就成了字符串與字符串比較了。字符串與字符串比較是按位比較,當第一位的時候,1小於2,所以就成了200>1200。關於這個的詳細情況,請點擊這里查看。這里還有一點是需要注意的,那就是我們的輸入框使用的是input 這里獲取的數據是string類型,雖然我們對這個輸入框加了限制只能輸入數字,但是這個數據類型還是string的類型。所以一本萬利的辦法就是在驗證的時候,對這個兩個變量都進行強制轉換程數字。也就是在上面程序的26行改成下面的代碼:
if(Number(num1)>Number(input_val)){
這樣就能正確的啦!