我正在阅读一个 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被连接起来(如果你愿意,你可以在规范中找到它),这会给你你正在寻找的结果。