Javascript 在纯函数中使用Object.keys()这样的全局函数会被合理地视为杂质吗?

Javascript 在纯函数中使用Object.keys()这样的全局函数会被合理地视为杂质吗?,javascript,dependency-injection,functional-programming,side-effects,pure-function,Javascript,Dependency Injection,Functional Programming,Side Effects,Pure Function,我目前正在进行React项目,研究如何将不纯净函数转换为纯函数,以减少副作用,使代码更整洁、更易于理解 我相信/希望在可能的情况下转换为纯功能将实现这一点 我的问题是,在函数中使用Object.keys()会被视为杂质吗 Object.keys() 我的想法是,虽然Object.keys()是一个不在getObjectKeys范围内的函数,但它在vanilla JS中是全局的,因此它不会被认为是一个杂质,也不需要添加到函数参数中,以便通过使用依赖项注入使函数变得纯粹。因此,当询问getObjec

我目前正在进行React项目,研究如何将不纯净函数转换为纯函数,以减少副作用,使代码更整洁、更易于理解

我相信/希望在可能的情况下转换为纯功能将实现这一点

我的问题是,在函数中使用Object.keys()会被视为杂质吗

Object.keys() 我的想法是,虽然
Object.keys()
是一个不在
getObjectKeys
范围内的函数,但它在vanilla JS中是全局的,因此它不会被认为是一个杂质,也不需要添加到函数参数中,以便通过使用
依赖项注入
使函数变得纯粹。因此,当询问
getObjectKeys
是否为纯函数时:

  • 对于相同的输入,它是否输出相同的->是
  • 修改任何外部变量或对象属性->否
  • 有没有副作用

你会考虑GETObjistKEY是纯函数吗?< /P>

function getObjectKeys(obj) {
    return Object.keys(obj)
}

它(几乎)纯净。“几乎”,因为你假设输入是一个对象,我认为你可以通过输入错误的输入使它失败

然而,这确实很重要,它是绝对无意义的

function getObjectKeys(obj) {
    return Object.keys(obj)
}

在您真正的代码库中。它不会使任何东西变得更好,更不可读,更不可维护。这不是函数式编程的全部内容。

纯函数是一个函数,对于给定的输入,它总是返回相同的输出,并且没有副作用
Object.keys()
属于该类别,因此您的函数仍然是纯函数。你指的是什么副作用?即使它不是语言的一部分,实际上是一个随机库提供的函数,它仍然是纯IMOHi blex,有趣的是,我要问第二个问题,cloneDeep(lodash)会被认为不纯净吗?它会有多不纯净。但你已经回答了,谢谢。我现在明白你指的是什么了。当它需要另一种方法存在时,你会怀疑这是否会使它变得不纯。是的,如果该方法不存在,您的函数将失败。但这不是由于杂质,而是由于编程错误,你有点误解了纯函数的意义:它们可以是全局的,因为它们是无状态的,没有副作用。纯函数
foo
const x=123
相同。在全球范围内使用它没有什么害处。依赖于其他纯函数的函数在FP中非常常见。唯一重要的问题是依赖硬编码函数deptency还是动态函数deptency。后者将您的函数转换为更高阶的函数,这通常更灵活。但有时您不需要这种额外的灵活性。@scriptum但是,如果我在程序中的某个地方更改
Object.keys
的全局引用,会怎么样:
Object.keys=其他(可能不纯净)函数
?函数声明不是写保护的,而不是
const
——事实上,我可以覆盖它。我知道,这个具体的例子是理论上的——尽管它可以延伸到一个纯函数所依赖的全局范围内的所有可变引用。我想说的是,最确定的是
getObjectKeys
可以被认为是纯的,但我们必须仔细检查源代码才能绝对确定。“我认为您可以通过提供错误的输入使其失败”您确实可以,提供任何静态方法族(.entries、.keys、.value)null或未定义都将抛出。