javascript中奇怪的语法:';某物'++;新日期

javascript中奇怪的语法:';某物'++;新日期,javascript,jquery,Javascript,Jquery,我正在阅读一个jquery插件,并发现以下有趣的语法: 'sth'+ +new Date 它创建一个数字字符串,作者将其用于唯一id:sth1237004731731 我很好奇它是什么样的语法,如果有关于它的阅读材料?谢谢 它使用JavaScript类型强制的一些副作用来构建唯一标识符(可能是元素的标识符)。令人困惑的部分是+新日期。这里,newdate(或newdate())返回一个Date对象。但是将+或-放在前面会迫使JS解释器将该值强制转换为Number对象,而JS执行DateNumb

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

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


我很好奇它是什么样的语法,如果有关于它的阅读材料?谢谢

它使用JavaScript类型强制的一些副作用来构建唯一标识符(可能是元素的标识符)。令人困惑的部分是
+新日期
。这里,
newdate
(或
newdate()
)返回一个
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();

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

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

“某物”
,然后是
+
,然后是
+新日期

二进制
+
的第一个操作数只是一个通用字符串文本。第二个操作数使用,按照链接的标准状态,它将其操作数转换为
数字

由于
new
运算符具有,因此它比一元
+
绑定得更紧,这意味着将首先计算
新日期。因此,一元
+
的操作数依次是表达式
新日期的结果。当然,
newdate
只是创建一个空白的
Date
对象。根据:

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

换句话说,
新日期
将只是表示当前时间的
日期
对象。然后,
+新日期
将把一个空白的
日期
对象转换成一个数字

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

答案很长:遵循规范 按照规范,一元
+
调用
ToNumber(GetValue(expr))
其中
expr
是计算的操作数
GetValue(dateObj)
将只返回
dateObj
,因此表达式将变成
ToNumber(dateObj)

的结果取决于参数的类型。对于对象,它返回
ToNumber(ToPrimitive(输入参数,提示编号))

ToPrimitive
将依次调用。它返回一个
数字
,这是与
日期
对象关联的时间值:最后,我们要找的!然后它返回到链的上游:
ToNumber(num)
只返回
num


当然,从这里开始,字符串
“sth”
+new Date
的结果被连接在一起(如果您愿意,您可以在规范中找到),这会给出您想要的结果。

好了,谢谢!它解释得很清楚。这也是我讨厌javscript的原因之一:)谢谢你的解释@Andrew!我完全同意你的观点,在被许多神秘的例子弄糊涂之后。我同意一元
+
通常是神秘的,因为没有多少人知道它。另一种选择是使用
Number(expr)
而不是
+expr
。这两个函数的行为相同,只是
+expr
将返回
ToNumber(GetValue(expr))
Number(expr)
只返回
ToNumber(expr)
。在现实世界中,这意味着没有区别,因为
GetValue
主要用于内部(规范级)目的。@Reid,我不知道。
Date
对象有一个特定的方法来返回从一开始就存在的时间戳。就在最近,有一个非常奇怪的搜索,寻找尽可能最小的编码表达式,它似乎总是升级到“副作用”领域,我认为这有点危险。它阻止了年轻程序员摸索这种语言,并在更广泛的社区中制造了一个楔子(似乎我们还需要更多)。JS是一种非常简单的语言(有一些非常奇怪的怪癖),但如果这种情况继续下去,我们的代码将读起来像正则表达式一样。感谢@Reid的深入解释!如果Stack允许,我也希望能将您的答案标记为已接受:)