我正在阅读jquery插件,并找到这个有趣的语法:
'sth'+ +new Date
它会创建一个数字字符串,作者使用该字符串作为唯一ID:sth1237004731731
我很好奇它是什么样的语法,如果有一些关于它的阅读材料?谢谢!
答案 0 :(得分:5)
它使用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();
但是,如果您希望某人可能需要维护您的代码,请避免编写类似您示例的内容。如果它阻止了你的轨道,它可能会阻止很多人。编码风格不仅仅是表达对翻译的意图,而是表达对人类开发者的意图。如果代码在浏览器中工作但在大多数有经验的开发人员的头脑中失败并出现语法错误,那么你做错了,简单明了。
答案 1 :(得分:4)
这是一元+
运算符的有趣用法。基本上,您可以将此表达式分解为三个单独的部分,在二进制+
运算符处拆分:
"sth"
,然后是+
,然后是+new Date
。
二进制+
的第一个操作数只是一个通用的字符串文字。第二个操作数使用unary +
operator,正如链接标准所述,它将其操作数转换为Number
。
由于new
运算符具有the highest precedence,因此它比一元+
“更紧密”,这意味着将首先评估new Date
。因此,一元+
的操作数反过来是表达式new Date
的结果。当然,new Date
只会创建一个空白Date
对象。根据{{3}}:
新构造的[[PrimitiveValue]]内部属性 对象设置为标识当前时间的时间值(UTC)。
换句话说,new Date
只是一个代表当前时间的Date
对象。反过来,+new Date
会将空白Date
对象转换为数字。
规范很长,很难遵循。简而言之,+new Date
返回与当前时间关联的UNIX时间戳。
遵循规范的长答案是一元+
调用ToNumber(GetValue(expr))
,其中expr
是计算的操作数。 GetValue(dateObj)
只会返回dateObj
,因此表达式变为ToNumber(dateObj)
。
§ 15.9.3.3 new Date()的结果取决于参数的类型。对于对象,它返回ToNumber(ToPrimitive(input argument, hint Number))
。
ToPrimitive
会拨打ToNumber
。返回Number
,这是与Date
对象关联的时间值:最后,我们要找的是什么!然后它回到链上:ToNumber(num)
只返回num
。
当然,从那里开始,字符串"sth"
和+new Date
的结果被连接起来(如果你愿意的话,可以在规范中找到),这样就可以得到你想要的结果