在JavaScript中使用标识功能

Aad*_*hah 4 javascript identity functional-programming function use-case

我在所有JavaScript程序中使用identity函数:

function identity(value) {
    return value;
}
Run Code Online (Sandbox Code Playgroud)

其原因是,我经常需要原语类型区分(undefined,null,boolean,numberstring()和对象类型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
Run Code Online (Sandbox Code Playgroud)

身份函数比以下代码小得多且简单:

function isObject(value) {
    var type = typeof value;
    return type == "object" || type == "function";
}
Run Code Online (Sandbox Code Playgroud)

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

我不想从我的任何程序中删除此功能,因为我认为这是一个优雅的黑客.然后我再也不为自己编写程序.JavaScript中的身份功能还有其他用例吗?

Tom*_*icz 16

恕我直言:

new identity(value) == value
Run Code Online (Sandbox Code Playgroud)

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

isObject(value)
Run Code Online (Sandbox Code Playgroud)

无论如何实施,从一开始就很明显.为什么你不能名为的函数中使用你的hack isObject()

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

  • @AaditMShah:我印象非常深刻(BTW使用`===`可能会更快一点)并且我确信它有效.我的意思是:无论多快,很多人,包括我自己,都不知道它的作用.而且(惊喜!)你为人而不是计算机编写软件. (2认同)

kay*_*kay 7

我更新了我的" speedtest "以测试是否返回了正确的结果......它们不是:

如果你比较new identity(x) == x,那么null被视为一个对象.===尽管如此.

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

如果你比较=== 'object'/ 'function'isObject代码,那么这将是双一样快,你原来的落实,近三分之一的速度比new identity(x) === x.