Leecode可以用js刷題,我的大js越來越被認可了吧?但是js的壹些特性會在妳刷題的時候掉坑。我來總結壹下我摔的坑。
pit 1: JS中的數組對象是壹個引用對象。
在js中,除了object,數組對象也是引用對象,這壹點經常被忽略。所以遞歸傳遞數組時,要用arr.slice(0)復制壹個新的數組,否則妳傳入的數組會被遞歸改變相同的級別,結果是錯誤的。
所以只要復制數組,最好是這樣寫,除非妳真的要引用。請註意,切片和拼接之間有很大的區別。如果使用splice(0),也可以復制陣列,但會刪除原始陣列,因為splice是壹個操作。
添加和刪除的元素,返回值是刪除元素的集合。Splice(0)表示從idx刪除到數組末尾,所以返回值也是這個數組。Slice(開始,結束)可以理解為切片。省略end意味著轉到數組的末尾。如果end為負,
從數組末尾開始計數。
Pit 2: JS中的排序默認是按照字典順序排序的。
壹般在排序的時候,認為如果是升序的話就不需要寫compare函數了。但是js中的arr.sort()是按字典順序排序的,這就導致妳在數組非負的情況下使用sort就能得到想要的效果,但如果有負數就錯了。
比如arr=?
所以記得寫比較函數,不要偷懶,最好寫匿名函數。
坑三:函數沒有變量提升。
其實這個壹般不容易犯,主要是我當時和二坑結合了。我在自定義比較函數的時候,寫的是VARCompare = function (a,b){ returnb;},沒錯,但是我是寫在sort下的,所以sort找不到compare函數,所以按照默認的字符順序排列。
我覺得compare的定義有問題。在函數中定義變量有壹個“變量提升”,就是在函數的任何地方定義vara,就相當於在函數的開頭定義vara,所以習慣了之後,妳就忘了函數不是變量,沒有變量提升。妳找不到下面的定義。所以當編寫比較函數時,
把它寫成匿名函數。
坑四:浮點數運算不準確
試試console.log(0.3-0.2)妳會發現是0.00998.999999998995我發現js只要有奇數浮點數就不能準確計算。這應該和js中浮點數存儲的機制有關。這個問題沒有好的解決辦法。壹般來說,答案是保留2或3位小數,用fixed (n)直接保留。
n位就夠了,這個方法本來就是四舍五入的。但是總有想取上下界而不是取四舍五入的情況,所以只能通過壹些方法來黑。比如妳想取前兩位:(a * 100-b * 100)/100。
坑五:判斷數組為空。
如果(!Arr),因為數組不像變量那樣隱式轉換,所以可以使用arr . length >;0,但是在某些情況下,可能那個變量不是數組,所以不能去長,所以我在網上看到了壹個比較全面的方法,就是先判斷對象。
底部是否是數組類型,再拿長度來判斷。