为何Array.isArray加括号无法生效?何时调用方法无需括号?
问题解析:Array.isArray加括号导致函数失效的原因及无括号调用方法的场景
先看两段对比代码:
function steamrollArray(arr) { const flat = [].concat(...arr); return flat.some(Array.isArray) ? steamrollArray(flat) : flat; }
function steamrollArray(arr) { const flat = [].concat(...arr); return flat.some(Array.isArray()) ? steamrollArray(flat) : flat; }
一、为什么Array.isArray()加括号会失效?
核心原因是参数类型不匹配:
Array.some()要求传入一个回调函数,这个函数会在遍历数组时被逐个传入元素调用,以此判断是否有元素满足条件。Array.isArray()是直接调用该函数,由于未传参数,它会返回false(Array.isArray()接收一个参数判断是否为数组,无参数时默认传入undefined,而undefined不是数组,因此返回false)。- 第二段代码中,
flat.some(false)相当于给some()传了一个非函数值,此时JS会自动把它包装成一个始终返回false的函数,导致some()直接返回false,跳过递归逻辑,数组无法完成扁平化,自然失效。
二、哪些场景调用方法无需加括号?
只有当你需要传递函数本身的引用,而非立即执行函数获取返回值时,才不需要加括号,常见场景包括:
- 作为高阶函数的回调参数:比如数组的
map、filter、some、every等方法,需要传入函数作为遍历判断/处理逻辑,例如arr.filter(Array.isArray)、nums.map(Number)。 - 事件处理器绑定:给DOM元素绑定事件时,传递函数本身作为处理器,由事件触发时自动调用,例如
btn.addEventListener('click', handleSubmit)。 - 函数赋值为变量引用:把函数本身赋值给变量,后续可通过变量调用,例如
const checkArray = Array.isArray; checkArray([1,2])。 - 原型方法复用:直接引用原型链上的方法,比如
const strConverter = Array.prototype.join,后续可用strConverter.call([1,2], '-')复用该方法。
内容的提问来源于stack exchange,提问作者Евгений Черник
相关产品推荐
相关产品推荐

