5

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

function identity(value) {
    return value;
}

原因是我经常需要区分运算符返回的基本类型( undefinednullboolean和)和对象类型(number和) 。我觉得在这个用例中使用 indentity 函数非常简洁:stringobjectfunctiontypeof

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

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

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

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

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

4

2 回答 2

19

恕我直言:

new identity(value) == value

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

isObject(value)

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

BTW 更适合http://codereview.stackexchange.com

于 2012-07-14T16:44:52.500 回答
9

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

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

这些陷阱有利于isObject(...)解决方案。

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

于 2012-07-14T17:18:30.973 回答