JavaScript函數(shù)arguments
arguments 是一個 對應(yīng)于 傳遞給函數(shù)的參數(shù) 的 類數(shù)組(array-like)對象。
array-like意味著它不是一個數(shù)組類型,而是一個對象類型:
- 它擁有數(shù)組的一些特性,比如說length,比如可以通過index索引來訪問;
- 它沒有數(shù)組的一些方法,比如forEach、map等;
arguments轉(zhuǎn)數(shù)組
// 1.自己遍歷
var newArr = []
for (var i = 0; i < arguments.length; i++) {
newArr.push(arguments[i] * 10)
}
console.log(newArr)
//Array.prototype.slice將arguments轉(zhuǎn)成array
var newArr2 = Array.prototype.slice.call(arguments)
console.log(newArr2)
var newArr3 = [].slice.call(arguments)
console.log(newArr3)
// 2.3.ES6的語法
var newArr4 = Array.from(arguments)
console.log(newArr4)
var newArr5 = [...arguments]
console.log(newArr5)
箭頭函數(shù)不綁定arguments
箭頭函數(shù)是不綁定arguments的,所以我們在箭頭函數(shù)中使用arguments會去上層作用域查找
// 1.案例一:
var foo = () => {
console.log(arguments) // 找不到,報錯
}
foo()
// 2.案例二:
function foo() {
var bar = () => {
console.log(arguments) // [123 ...]
}
return bar
}
var fn = foo(123)
fn()
JavaScript純函數(shù)
純函數(shù)的定義: 確定的輸入,一定會產(chǎn)生確定的輸出; 函數(shù)在執(zhí)行過程中,不能產(chǎn)生副作用;
副作用: 表示在執(zhí)行一個函數(shù)時,除了返回函數(shù)值之外,還對調(diào)用函數(shù)產(chǎn)生 了附加的影響,比如修改了全局變量,修改參數(shù)或者改變外部的存儲;
純函數(shù)的案例
slice:slice截取數(shù)組時不會對原數(shù)組進行任何操作,而是生成一個新的數(shù)組;slice就是一個純函數(shù),不會修改傳入的參數(shù);
splice:splice截取數(shù)組, 會返回一個新的數(shù)組, 也會對原數(shù)組進行修改; 非純函數(shù)
純函數(shù)優(yōu)勢
只是單純實現(xiàn)自己的業(yè)務(wù)邏輯即可,不需要關(guān)心傳入的內(nèi)容是如何獲得的或者依賴其他的外部變量是否已經(jīng)發(fā)生了修改;
你在用的時候,你確定你的輸入內(nèi)容不會被任意篡改,并且自己確定的輸入,一定會有確定的輸出;
實例:React中就要求我們無論是函數(shù)還是class聲明一個組件,這個組件都必須像純函數(shù)一樣,保護它們的props不被修改
JavaScript柯里化
柯里化:只傳遞給函數(shù)一部分參數(shù)來調(diào)用它,讓它返回一個函數(shù)去處理剩余的參數(shù);
function add(x, y, z) {
return x + y + z
}
var result = add(10, 20, 30)
console.log(result)
function sum1(x) {
return function(y) {
return function(z) {
return x + y + z
}
}
}
var result1 = sum1(10)(20)(30)
console.log(result1)
柯里化簡化代碼
// 簡化柯里化的代碼
var sum2 = x => y => z => {
return x + y + z
}
console.log(sum2(10)(20)(30))
var sum3 = x => y => z => x + y + z
console.log(sum3(10)(20)(30))
柯里化意義:希望一個函數(shù)處理的問題盡可能的單一,而不是將一大堆的處理過程交給一個 函數(shù)來處理;
組合函數(shù)
組合函數(shù):依次執(zhí)行的兩個函數(shù),每次都需要進行兩個函數(shù)的調(diào)用,可將其組合起來,自動依次調(diào)用
function hyCompose(...fns) {
var length = fns.length
for (var i = 0; i < length; i++) {
if (typeof fns[i] !== 'function') {
throw new TypeError("Expected arguments are functions")
}
}
function compose(...args) {
var index = 0
var result = length ? fns[index].apply(this, args): args
while(++index < length) {
result = fns[index].call(this, result)
}
return result
}
return compose
}