本篇全是重點,撿常用的懟,數值的擴展比較少,所以和函數放一起:
一,數值
1,Number.EPSILON:用來檢測浮點數的計算,如果誤差小于這個,就無誤
2,Math.trunc():取整,去除小數部分,如果是-0.123,去除之后會留下-0,這個要注意
其他感覺用的都不多,就這兩個。
?
二,函數:
1,es6引入了rest參數:...變量名,它跟arguments的區別,它是真正的數組
2,箭頭函數:
函數體內的this對象就是定義時所在的對象,不是使用時所在的對象;
不可以當做構造函數,即不可以使用new
不可以使用arguments對象,在函數體內不存在,如果要用,可以用rest參數
不可以使用yield命令,不能用作Generator函數。
3,尾調用
指某個函數的最后一步調用另一個函數,注意,這里是只return一個函數,而不是什么表達式之類的
function f(x) {return g(x);
}
尾調用優化:
函數在調用的時候會形成一個“調用幀”,在內存中形成一個“調用記錄”,保存調用位置和內部變量,如果此時在函數A中再調一個函數B,那么在A的調用幀的上方就會形成一個B的調用幀,只有當B函數執行結束返回到A的時候,B的調用幀才會消失,也就是說當B在執行的時候,只要B函數的下方還有程序要執行,A的調用幀就一直占用著,因為要等B執行完成后繼續執行,同樣,如果此時B里面還有一個函數C,那么執行函數C的時候,B的調用幀也要被占著,A的也是,那這樣內存就會有很大的損耗,形成了一個“調用棧”。
如果函數B是函數A的最后一步調用呢,那么執行函數B的時候,A的調用幀就會自動消失,因為B就是它的最后一步,函數A不需要再記錄它的調用位置和內部變量了,所以只留下了B函數的調用幀,同樣,如果C函數也是B函數的最后一步,那么調用C函數的時候,B函數的調用幀也會消失,原因同上,所以這極大地減少了內存的占用。
綜上:“尾調用優化”本質就是只保留內層函數的調用幀,每次執行函數的時候調用幀只有一個,大大節省內存。
比如遞歸的時候,非常消耗內存,因為需要同時保存著N多個調用幀,所以很容易發生“棧溢出”的錯誤。但如果改成“尾遞歸”,調用幀只有一個,所以不會發生“棧溢出”的問題。
function factorial(n) {if (n===1) return 1;return n * fatorial(n-1);
}// n如果過大就容易棧溢出,現在改成尾遞歸function factorial(n, total) {if (n===1) return total;return factorial(n-1, n*total);
}// 調用幀永遠只有一個,極大減少內存占用
?
?三,數組
1,擴展運算符:三個點(...),就是rest參數的逆運算,將一個數組轉為用逗號分隔的參數序列。
?
2,Array.from():用于將兩類對象轉換成數組,類數組對象(比如NodeList和arguments)和可遍歷對象(Iterator Object),它還可以接受第二個參數,作用類似于map,對數組的每一項進行操作,然后將結果返回到數組。
?
3,Array.of():用于將一組值轉換成數組,括號里面傳的參數組成的數組,哪怕只有一個數,也是一個元素的數組,在es5里面,Array方法如果只傳一個數字,默認就是數組的長度,但是Array.of()不一樣,傳一個數字就表示一個數字的數組。
?
4,find():找出第一個符合條件的數組成員,參數是回調函數,這里非常容易寫成元素,要注意寫條件,沒有則返回undefined,用法如下:
[1, 4, -5, 10].find((n) => n<0)// -5[1, 5, 10, 15].find(function(value, index, arr) {return value > 9
})// 10
?
5,findIndex():找出第一個符合條件的數組成員的位置,參數也是回調函數,沒有則返回-1,用法同上
?
(所以如果要使用數組查找某個元素是否存在,還是用es7的includes()比較好,但是要注意使用babel的transform-runtime這個plugin)
?
6,數組實例的entries(),keys(),values():
返回的都是一個Iterator Object,也就是說可以用iterator object.next().value來依次訪問,
entries是對鍵值對的遍歷,keys是對鍵的遍歷,values是對值的遍歷,
注意,不要和Object的三個同名方法搞混了,那個是es7的!
?
7,數組實例的includes(),(這里我寫錯地方了,這個是es7的)
數組是否包含某個元素,有就返回true,沒有就false,可以傳NaN來檢測NaN。es5的indexOf無法檢測NaN
?
8,數組的空位
es5對數組的空位處理:
? forEach,filter,every,some都會跳過空位,
? map會跳過空位,但是會保留這個值,
? join和toString會將空位設為undefined,而undefined和null會被處理成字符串
es6則是明確將空位轉為undefined,所以盡量不要留空位
?
?