【问题标题】:Use of the identity function in JavaScriptJavaScript 中标识函数的使用
【发布时间】:2012-07-14 04:34:59
【问题描述】:

我在所有 JavaScript 程序中都使用了标识函数:

function identity(value) {
    return value;
}

原因是我经常需要区分原始类型(undefinednullbooleannumberstring)和对象类型(objectfunction)返回typeof 运算符。我觉得在这个用例中使用 indentity 函数非常简洁:

if (new identity(value) == value); // value is of an object type
if (new identity(value) != value); // value is of a primitive type

identity函数比下面的代码更小更简单:

function isObject(value) {
    var type = typeof value;
    return type == "object" || type == "function";
}

然而,在阅读我的代码时,我的一位朋友抱怨说我的 hack 具有误导性,并且比上述替代方案的计算成本更高。

我不想从我的任何程序中删除此功能,因为我认为这是一个优雅的 hack。再说一次,我不只是为自己编写程序。 JavaScript 中的标识函数还有其他用例吗?

【问题讨论】:

  • 为什么不直接使用value === Object(value)?或者,为了更易读的代码,定义isObject来使用它?
  • @Cory - 我只是想找到一个身份功能的实际用例。我手头有太多时间,所以我用有趣的措辞来表达这个问题,以引起人们的注意,而不是被视为一个愚蠢的白痴,要求提供身份功能的用例。
  • 最好的用途之一是使可能应用或不应用函数的代码始终如一地工作:var func = optionalProcessFunc || identityFunc;。现在稍后在代码中,您无需了解有关此部分如何配置为运行的任何信息。更一般地,如果您想将函数视为幺半群,则将恒等函数用作 mzero 并将 compose 用作 mconcat 会很方便。
  • {x: 123} != {x:123} ,JS中的对象默认不相等,因为它有不同的引用。与该 func 本身相比,为什么从标识函数返回一个对象的计算结果为 true ?我认为构造函数返回新对象

标签: javascript function functional-programming identity use-case


【解决方案1】:

恕我直言:

new identity(value) == value

绝对没有任何意义,如果没有额外的评论,我将不得不考虑一段时间才能弄清楚意图是什么。另一方面:

isObject(value)

从一开始就很明显,无论它是如何实现的。为什么你不能在一个名为isObject() 的函数内部使用你的hack?

顺便说一句,更适合http://codereview.stackexchange.com

【讨论】:

  • new identity(value) 是一个不错的小技巧。如果构造函数没有显式返回对象(即objectfunction 类型的值),JavaScript 引擎只会返回构造函数的实例。因此new identity(value) 始终是一个对象。因此new identity(value) == value 仅在value 是一个对象时才返回true。这是因为当操作数之一是对象时,JavaScript 中的相等运算符总是检查identity。双关语不错吧?
  • @AaditMShah:我真的印象深刻(顺便说一句,使用=== 可能会快一点),我确信它有效。我的意思是:不管它有多快,很多人,包括我自己,都不知道它做了什么。而且(惊喜!)您为人而不是计算机编写软件。
  • 是的。我朋友也是这么说的。尽管如此,当您有一些时间并且无事可做时,看看您如何以奇怪和创新的方式使用现有技术是很有趣的。
  • 顺便说一句,你是对的。使用严格相等确实可以提高性能。谢谢。
  • 更不用说,在您使用它的任何地方都需要该评论。撇开 Kay 发现的正确性问题不谈,我认为这种事情的礼仪应该是——如果你是唯一的维护者,那就去做吧。如果你在一个团队中,isObject 是一个优雅的选择:它是自文档的,它隐藏了它的实现,它不需要了解 Javascript 的丑陋部分。 PHP 的“变量”优雅吗?
【解决方案2】:

我更新了我的“speedtest”来测试是否返回了正确的结果……它们不是:

如果与new identity(x) == x 比较,则null 被视为对象。不过=== 有效。

这些陷阱支持isObject(...) 解决方案。

如果您比较isObject 代码中的=== 'object'/'function',那么它的速度将是您最初实现的两倍,比new identity(x) === x 快近三分之一。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2022-11-30
    • 2021-04-25
    • 2020-10-14
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多