選用JS
leecode可以用js刷題了,我大js越來越被認可了是吧。但是刷題中會因為忽略js的壹些特性掉入坑裏。我這裏總結壹下我掉過的坑。
坑1:js中數組對象是引用對象
js中除了object還有數組對象也是引用對象,這點常常被忽視,所以在遞歸的時候傳遞數組要用arr.slice(0)這樣復制壹個壹樣的新數組,不然會出現妳傳入的數組會被同級的遞歸改變,結果就不對了。
所以只要數組復制的地方最好都要這麽寫,除非妳真的想引用。而且註意是slice不是splice這兩個方法差別很大,妳如果用splice(0)也能得到數組的復制,但是妳將會刪了原數組,因為splice是壹個操作
增加和刪除的元素,返回值是刪除的元素的集合。splice(0)是表示從idx為0開始刪除到數組尾部,所以得到的返回值也是這個數組。slice(start,end)可以理解為切片,省略end表示到數組尾部,如果end為負
則從數組尾部開始數。
坑2:js中的sort是默認以字典序排序
壹般排序的時候都以為如果是升序就不用寫compare函數,然而js中的arr.sort()是按字典序排序的,這就導致妳如果數組中都是非負數用sort可以得到妳想要的效果,但是有負數的話就不對了。
比如arr=[-1,-3,-5,7,4,-2];arr.sort();console.log(arr);
妳會得到?[-1,-2,-3,-5,4,7]?
所以要記得寫compare函數,不要偷懶,寫成匿名函數的形式最好。
坑3:函數沒有變量提升
其實這個壹般不容易犯,主要當時我是和第二個坑結合了,我自定義compare函數的時候寫的是varcompare=function(a,b){returna-b;},本來沒錯,但是我寫在了sort的下面,於是sort找不到compare函數就按照默認的字符順序排列,搞的
我還以為是compare定義出現了問題。函數中定義變量是有“變量提升”的,就是說妳在函數的任何位置定義vara都相當於在函數最開始的地方定義了vara,所以用習慣了之後就忘了函數不是變量,沒有變量提升了。妳在下面定義會找不到。所以寫compare函數的時
候寫成匿名函數吧。
坑4:浮點數運算不精確
試試console.log(0.3-0.2)妳會發現是0.09999999999999998。我發現只要有奇數的浮點數存在,js就無法精確計算。這應該跟浮點數在js中存儲的機制有關系。這個問題沒有太好的解決辦法,壹般來講答案是要求保留2位或3位小數的,利用toFixed(n)直接保留
n位就可以了,這個方法本來就是四舍五入的。但是總有些情況妳可能不想四舍五入而是想取上下界什麽的,這樣就只能靠壹些方法hack比如妳想取前兩位:(a*100-b*100)/100這樣。
坑5:判斷數組為空
判斷數組為空時不能像變量壹樣直接用if(!arr),因為數組不會像變量那樣隱式轉換,所以可以在妳知道arr是個數組的情況下使用arr.length>0判斷,但有些情況下可能那個變量還不是數組,就不能去length,所以網上看了壹個比較周全的方法,就是先判斷該對象到
底是不是數組類型的,然後再取長度判斷