首页 > 解决方案 > 短回调函数语法背后的原理

问题描述

这背后的原理是什么? newArr.some(Array.isArray)=== newArr.some(elem => Array.isArray(elem))

怎么可能将它们解析为相等?我认为newArr.some(Array.isArray)=== newArr.some(Array.isArray())(假设这some是一个循环并且 JS 假设每个 val 都是 func 的隐含参数),但事实并非如此。所以,我很困惑。请帮我。

这里,有上述案例的2个应用:


function flatMultiArr(arr) {
let newArr = [].concat(...arr);
return newArr.some(Array.isArray)
? flatMultiArr(newArr)
: newArr
}

console.log();//[ 1, {}, 3, 4 ]

function flatMultiArr(arr) {
let newArr = [].concat(...arr);
return newArr.some(elem => Array.isArray(elem))
? flatMultiArr(newArr)
: newArr
}

console.log();//[ 1, {}, 3, 4 ]

注意这个问题不是关于如何展平多维数组。

标签: javascriptfunctionfunctional-programming

解决方案


这个原理被称为eta 转换。不,它们不是“被解析为相等”,它们是不同的函数,但它们的行为相同,因此可以进行相同的推理。简化:

const f = Array.isArray

function f(x) { return Array.isArray(x); }

调用1时将产生相同的结果,即f([])or f(5)

1:一般来说,方法中this绑定和参数的数量有细微的差别,但它适用于Array.isArray.


推荐阅读