返回新对象的函数可以被认为是“纯粹的”吗?

Mar*_*wal 4 javascript functional-programming

给出定义:

纯函数是给定相同输入的函数,将始终返回相同的输出并且不产生副作用。

我们可以将函数视为AmIPure纯函数吗?根据定义没有,但我想确定一下。

function Amount(value, currency) {
  this.value = value;
  this.currency = currency;
}

function AmIPure(value, currency) {
  return new Amount(value, currency);
}

var foo = AmIPure(5, "SEK");
var baz = AmIPure(5, "SEK");
console.log(foo === baz); //false
Run Code Online (Sandbox Code Playgroud)

Dam*_*ano 5

这取决于“相同”的定义。

如果您期望严格的对象相等,那么只有返回标量(例如数字、布尔值...)的函数才可以被视为“纯”。

不过,一般来说,这并不是您真正的意思:您通常不关心是否获得了完全相同的对象实例,仅当它根据某些定义等于另一个对象实例时,例如:

  • 如果它们是具有相同字符的字符串 ("HELLO""HELLO")
  • 如果它们是具有相同属性名称和值的简单对象({x:0,y:1}并且{y:1,x:0}
  • 如果它们是具有相同顺序的相同元素的数组([1,2,3]并且[1,2,3])
  • ...

  • +1。此外,我们不能改变对象,因为这样它们的身份将再次变得相关。所以不可变的数据结构 FTW! (2认同)