javascript中的奇怪语法:“sth”+ + new Date

Strange syntax in javascript: 'sth'+ +new Date

本文关键字:sth new Date 语法 javascript      更新时间:2023-09-26

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

'sth'+ +new Date

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

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

它使用 JavaScript 类型强制的一些副作用来构建唯一标识符(可能用于元素(。令人困惑的部分是+new Date。在这里,new Date(或new Date()(返回一个Date对象。但是将+-放在前面会强制 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();

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

这是

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

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

二进制+的第一个操作数只是一个泛型字符串文本。第二个操作数使用一元+运算符,如链接标准所述,将其操作数转换为Number

由于new运算符具有最高的优先级,因此它比一元运算符"绑定得更紧密"+,这意味着将首先评估new Date。因此,一元+的操作数反过来又是表达式 new Date 的结果。当然,new Date只是创建一个空白Date对象。根据 § 15.9.3.3 新日期((:

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

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

简短的回答

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

长答案:遵循规范

遵循规范的长答案是,一元+调用ToNumber(GetValue(expr))其中expr是计算的操作数。 GetValue(dateObj)将简单地返回dateObj,所以表达式变成ToNumber(dateObj)

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

反过来,ToPrimitive将调用Date对象的 valueOf 属性。这将返回一个 Number ,这是与Date对象关联的时间值:最后,我们正在寻找什么!然后它回到链上:ToNumber(num)只是返回num

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