做插件、存資料我們可能大量用到了data屬性,jQuery的data方法很大地友善了我們讀取data的值,但是今天發現了一個奇怪的問題,生産系統中取到的值出現了錯誤,經過反複對比,結果發現是$(element).data(name)這一節在取的時候就出錯了,傳遞給伺服器當然會出問題。請看如下示範 http://jsfiddle.net/walker/yPpUR/2/
當存到data裡面的是數字(隻要是由數字構成就會被了解成數字)位數超過16位的時候,就已經失去了精度,而同時,我用了attr方法來取,卻能得到原生的值,目前隻能暫時把data(id)改為attr(“data-id”)
原因為何?
開始走了點彎路,在jQuery源碼裡找來找去,沒發現原因,單步跟蹤的時候發現一經過這一句,值就降低了精度:
if ( typeof data === "string" ) {
try {
data = data === "true" ? true :
data === "false" ? false :
data === "null" ? null :
jQuery.isNumeric( data ) ? +data :
rbrace.test( data ) ? jQuery.parseJSON( data ) :
data;
} catch( e ) {}
// Make sure we set the data so it isn't changed later
jQuery.data( elem, key, data );
} else {
data = undefined;
}
最後才發現是js本身的問題,然後由于jQuery的data方法的特性(支援傳入和讀取對象),是以把形如數字的字元串在取出的時候就變成了數字(上述代碼第6行),然後假如這個“數字”的範圍超過了js的精度範圍,自然就不對了。
關于精度的示範,可見如下示範http://jsfiddle.net/walker/yPpUR/4/
就到此為止吧。