我正在阅读一个 jquery 插件,发现这个有趣的语法:
'sth'+ +new Date
它创建了一个数字字符串,作者将其用作唯一 ID:sth1237004731731
我很好奇它是什么样的语法,是否有一些关于它的阅读材料?谢谢!
我正在阅读一个 jquery 插件,发现这个有趣的语法:
'sth'+ +new Date
它创建了一个数字字符串,作者将其用作唯一 ID:sth1237004731731
我很好奇它是什么样的语法,是否有一些关于它的阅读材料?谢谢!
它使用 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();
但是,如果您希望有人可能需要维护您的代码,请避免编写类似示例的代码。如果它阻止了你,它可能会阻止很多人。编码风格不仅仅是向解释器表达意图,而是向人类开发人员表达意图。如果代码在浏览器中工作,但在大多数有经验的开发人员的头脑中出现语法错误,那么你做错了,简单明了。
这是一元运算符的有趣用法+
。基本上,您可以将此表达式分解为三个独立的部分,在二元+
运算符处拆分:
"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
被连接起来(如果你愿意,你可以在规范中找到它),这会给你你正在寻找的结果。