3

我正在阅读一个 jquery 插件,发现这个有趣的语法:

'sth'+ +new Date

它创建了一个数字字符串,作者将其用作唯一 ID:sth1237004731731

我很好奇它是什么样的语法,是否有一些关于它的阅读材料?谢谢!

4

2 回答 2

6

它使用 JavaScript 类型强制的一些副作用来构建唯一标识符(可能用于元素)。令人困惑的部分是+new Date. 在这里,new Date(或new Date())返回一个Date对象。但是在 this 前面加上 a+或 a-会强制 JS 解释器将此值强制转换为Number对象,而 JS 这样做的方式Date>Number 是通过返回时间戳(或getTime())。

所以这段代码可以用不同的方式表达,如下所示:

var date = new Date(), // "Mon May 14 2012 10:03:58 GMT-0400 (EST)"
    timestamp = date.getTime(), // 1337004238612
    identifierString = "sth" + timestamp.toString();

您可能会合理地声称没有必要如此冗长,所以我个人可能会这样写:

var identifier = "sth" + (new Date()).getTime();

但是,如果您希望有人可能需要维护您的代码,请避免编写类似示例的代码。如果它阻止了你,它可能会阻止很多人。编码风格不仅仅是向解释器表达意图,而是向人类开发人员表达意图。如果代码在浏览器中工作,但在大多数有经验的开发人员的头脑中出现语法错误,那么你做错了,简单明了。

于 2012-05-14T14:20:28.703 回答
5

这是一元运算符的有趣用法+。基本上,您可以将此表达式分解为三个独立的部分,在二元+运算符处拆分:

"sth",然后+,然后+new Date

二进制的第一个操作数+只是一个通用的字符串文字。第二个操作数使用一元运算+,正如链接的标准状态,它将其操作数转换为 a Number

因为new运算符具有最高优先级,它比一元“绑定更紧密” +,这意味着new Date将首先评估。所以一元的操作数+又是表达式的结果new Date。当然,new Date只是简单地创建一个空白Date对象。根据§ 15.9.3.3 new Date()

新构造对象的 [[PrimitiveValue]] 内部属性设置为标识当前时间的时间值 (UTC)。

换句话说,anew Date将只是一个Date表示当前时间的对象。并且,反过来,+new Date会将空白Date对象转换为数字。

简短的回答

该规范很长且难以遵循。简而言之,+new Date返回与当前时间关联的 UNIX 时间戳。

长答案:遵循规范

遵循规范的长答案是一元+调用ToNumber(GetValue(expr))whereexpr是评估的操作数。GetValue(dateObj)将简单地返回dateObj,因此表达式变为ToNumber(dateObj).

结果ToNumber取决于参数的类型。在对象的情况下,它返回ToNumber(ToPrimitive(input argument, hint Number)).

ToPrimitive反过来,将调用对象的valueOf属性Date。这会返回 a Number,它是与对象关联的时间值Date:终于,我们要找的东西了!然后它回到链上:ToNumber(num)简单地返回num

当然,从那里,字符串"sth"和结果+new Date被连接起来(如果你愿意,你可以在规范中找到它),这会给你你正在寻找的结果。

于 2012-05-14T14:24:34.537 回答