1
大家都知道js在進行小數運算時會有丟失精度問題(其他語言也是),比如:
0.1+0.2 //0.30000000000000004
有一種比較快捷的方式是先把小數乘以10的整數倍,然後再運算,如:
(0.1*10+0.2*10)/10 //0.3
但是這種方式也不是100%準確的,乘以整百也可能精度丟失,比如:
2177.74*100 //217773.99999999997
所以常用的幾種處理方式有:
- 把小數轉化為字串,拆分整數部分和小數部分分別計算,然後再把結果進行拼接;
- 先乘10的整數倍,然後再用toFixed進行四捨五入,這樣能保證結果還是準確的,如:
(2177.74*100).toFixed(0); //217774
- 直接運算,然後再用toFixed(或者Math.round)進行四捨五入,用於對計算結果不是很精確的場景。
2
<a>標籤的download屬性可以用來設定使用者下載後的檔名稱,如:
<a href="xxx.jpg" download="改名後的檔案,jpg" />
但是有一點要注意,檔案不能跨域,如果下載檔案處於和當前域不同的域,則改名失敗。
3
用instanceof來判斷跨iframe的物件型別時,會失效。比如我們在父頁面定義了一個陣列:
var arr = [1,2,3];
然後在iframe中來訪問父頁面的arr物件:
console.log(parent.arr); //[1,2,3] console.log(parent.arr instanceof Array); //false
原因是不同的視窗各有一套自己的宿主物件,父視窗的Array構造器與子視窗的Array構造器並不是同一個,也就是說,arr是父視窗的Array例項,並不是子視窗的Array例項。
這就是為什麼我們判斷陣列的時候要這麼辦:
Object.prototype.toString.call(parent.arr); //[object Array]
4
我們常用JSON.stringify方法來格式化json物件。其實這個stringify方法還接收第三個引數,支援把格式化後的字串加一定縮排,比如:
JSON.stringify(obj, undefined, 4);
結果如下:
{
"num": 1234,
"str": "字串",
"arr": [
1,
2,
3,
4,
5,
6
],
"obj": {
"name": "tom",
"age": 10,
"like": [
"a",
"b"
]
}
}
沒錯,上面是一個字串。如果再用正則匹配一下,把屬性/值給加上不同的高亮顏色,那麼一個簡單的json資料展示功能就有了:
關於高亮函式的寫法,我在這篇文章中有詳細提到,有興趣可以去看看。
5
js的Date物件在進行日期計算時,會自動進行月份判斷以及平年閏年判斷,我們可以利用這一點來做一些小技巧。
當我們想計算某個月份有多少天時,經常會先判斷當前月份有30天還是31天,還得判斷是否是閏年。 其實,計算2016年7月份有多少天,可以這麼寫:
new Date(2016, 7, 0).getDate(); //31
js的月份從0開始,這裡我們其實求的是8月0號,就會得到7月31號,也就拿到了31這個天數。
同樣,想計算某天再過20天是幾月幾號,也不必進行自己判斷月份以及閏年。比如計算今天再過20天的日期:
new Date(2017, 6, 20+20); //Wed Aug 09 2017 00:00:00 GMT+0800
得到了8月9號。看到了吧,日期那裡超過了31號,js會自動幫你計算到下個月。