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

时间:2017-07-28 09:05:27

标签: javascript functional-programming

鉴于定义:

  

纯函数是一个给出相同输入的函数,总是会返回相同的输出并且不会产生副作用。

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

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

2 个答案:

答案 0 :(得分:4)

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

如果你期望严格的对象相等,那么只有返回标量的函数(例如数字,布尔值......)才能被认为是“纯粹的”。

一般情况下,这不是你真正的意思:你通常不关心你是否得到一个对象的完全相同的实例,只有当它相等根据某些定义,另一个定义,例如:

  • 如果它们是字符相同的字符串(await Task.Factory.StartNew( () => { cr.Create(current_file_name, output); File.Copy(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\HTMLViewer.html", outputPath + "\\HTMLViewer.html", true); ZipFile.CreateFromDirectory(outputPath, Directory.GetParent(outputPath) + "\\" + Path.GetFileNameWithoutExtension(current_file_name) + ".zip"); }); _window.MainDispatcher.BeginInvoke(() => { _popUp.PopUpText = "DeepZoom completed"; _popUp.BeginPopUpTimer(); }); "HELLO"
  • 如果它们是具有相同属性名称和值的简单对象("HELLO"{x:0,y:1}
  • 如果它们是具有相同顺序的相同元素的数组({y:1,x:0}[1,2,3]
  • ...

答案 1 :(得分:-1)

此处您从函数返回的结果是object。如果你比较它不会给出的对象。相反,您可以比较值

var foo = AmIPure(5, "SEK");
var baz = AmIPure(5, "SEK");
console.log(foo.value === baz.value && foo.currency === baz.currency ); 

这应该是真的。