如何知道 JavaScript 函数接受简单参数还是解构对象?

Big*_*boy 5 javascript callback jsx

考虑这两个函数:

const render = (entity) => {
   // function body
}

const render = ({
    entity,
    isAdmin
}) => {
   // function body
}
Run Code Online (Sandbox Code Playgroud)

现在假设我想调用这个函数。如果它接受解构的对象,我应该以不同的方式传递参数。

render({
    name: 'John', 
    age: 40
})

// or

render({
    entity: {
      name: 'John',
      age: 40
    },
    isAdmin: true
})
Run Code Online (Sandbox Code Playgroud)

有没有办法让我知道函数是否接受解构对象作为其参数?

请注意,render.length这两个函数都返回 1。并且arguments对我没有帮助,因为它可以在函数内部访问,而不是在函数外部访问。

更新

这是真实的场景。

我们有一个管理面板(类似于 React Admin),许多公司的 500 多个项目都在使用它。您可以想象我们有数千个列表以表格格式显示。

现在,对于每个表,开发人员为我们提供了一个render函数,该函数是用于表的每一行的 React 组件。

这就是他们使用我们<List />组件的方式:

const Customers = () => {
    return <List
        // other props like title, headers, etc.
        row={entity => <>
             <td>{entity.name}</td>
        </>}
    />
}
Run Code Online (Sandbox Code Playgroud)

我们不想强迫他们跨越数千个列表来编写row={({entity, metadata}) => <><td>{entity.name}</td></>}

Spe*_*ric 2

我不清楚为什么你需要这样做。函数的参数一旦声明就不会也不能更改,并且在调用函数之前您应该始终知道函数接受哪些参数。

然而,只是为了方便起见,这里有一个可以实现此目的的示例。将函数字符串化,然后使用正则表达式来匹配({ })参数列表中的 。

const render1 = (entity) => {}

const render2 = ({
    entity,
    isAdmin
}) => {}

const render3 = (arg) => someotherFunc({arg})

function doesDestructure(func){
  return /\({.+}\) =>/gm.test(func.toString().replaceAll("\n", ""))
}

console.log(doesDestructure(render1))
console.log(doesDestructure(render2))
console.log(doesDestructure(render3))
Run Code Online (Sandbox Code Playgroud)

或者适用于所有功能的版本:

const render1 = (entity) => {}

const render2 = ({
    entity,
    isAdmin
}) => {}

const render3 = (entity) => subscribe(({entity}) => {  })

function doesDestructure(func){
  return /\({.+}\)/gm.test(func.toString().replaceAll("\n", "").split("=>")[0])
}

console.log(doesDestructure(render1))
console.log(doesDestructure(render2))
console.log(doesDestructure(render3))
Run Code Online (Sandbox Code Playgroud)

  • 这不是完全取决于函数的格式是否良好吗?它会在 `(arg) =&gt; someotherFunc({arg})` 上失败 (2认同)
  • @Bigboy您可以从所有函数中以相同的方式调整参数。有不同的方法可以做到这一点,但你所建议的肯定会让其他开发人员将来讨厌你。每个调用者都必须检查,我真的无法理解你。 (2认同)
  • @Bigboy在函数参数声明中寻找解构语法是一个非常糟糕的主意。将函数的代码从 `(obj) =&gt; console.log(obj.a, obj.b)` 更改为 `({a, b}) =&gt; console.log(a, b)` 必须保留实现细节,期望做完全相同的事情,并且不能破坏调用者!您正在认真考虑编写如此脆弱的代码吗?当然,您可以在摆弄和原型设计时这样做,但绝对不要在有数百个库用户的生产中使用它! (2认同)